2010-12-29 14 views
0

In einer 3-Schicht-Windows-Anwendung, wo werde ich meine Konfigurationsdatei, die Unity-Konfiguration enthalten wird? Wenn es in Front-Layer ist, dann muss ich unity.dlls in allen meinen Front-, Business- und Daten-Layer-Projekten referenzieren, damit die Projekte IUnityContainer-Schnittstellen usw. erkennen können?Wo platziere ich meine Unity-Konfigurationsdatei?

Wo wird der Konfigurationscontainer geladen? Wird es in der Main-Methode oder in der Datenebene der Front-Ebene sein oder werde ich den Container bei Bedarf laden?

Wenn alles in Frontlayer platziert ist, dann ist nicht das ganze Projekt vom Frontlayer abhängig und wenn ich den Frontlayer von Windows App auf Web App ändere dann muss ich die Einheitsarbeit wieder machen!

+0

Es ist mindestens drei verschiedene Frage. –

Antwort

8

Unity oder ein anderer IoC-Container sollte in Ihrer Anwendung nie eine Rolle spielen, die über das ursprüngliche Bootstrapping der Anwendung hinausgeht. Und es sollte nachdrücklich nicht auf die Geschäfts- und Datenschichten eingehen.

Daher Bootstrap Ihre Anwendung in der Main mit Unity und danach Unity ist fertig. Lassen Sie Unity darüber hinaus keinen anderen Teil Ihrer Anwendung berühren.

Hier ist eine Ausarbeitung zu diesem Thema: How I use Inversion of Control containers und das Follow-up Pulling from the container.

Wenn alles in Frontlayer platziert ist, dann ist nicht das ganze Projekt von Frontlayer abhängig und wenn ich den Frontlayer von Windows App auf Webapp umsetze dann muss ich die Einheitsarbeit wieder machen!

Nicht, wenn Sie die Dinge richtig eingerichtet haben. Sie benötigen Unity nicht, um die Komponenten für Ihre Anwendung aufzulösen. Unity und andere IoC-Container sind nur sehr nützliche Tools zur Lösung dieses Problems. Sie sollten zuerst Ihre Anwendung schreiben, damit sie Unity nicht benötigt. Dann können Sie problemlos Unity oder einen anderen IoC-Container anschließen, um die Komponenten aufzulösen, die Ihre Anwendung ausführen muss.

Die drei R s von Dependency Injection sind

  1. Register
  2. Resolve
  3. Mitteilung

Register, wenn Sie Setup ist der Behälter. Dies geschieht, wenn Ihre Anwendung in Main gestartet wird. Resolve ist, wenn Sie die Stammkomponenten für Ihre Anwendung auflösen. Dies ist, was die Kernkomponenten Ihrer Anwendung zusammenbringt. Die Freigabe erfolgt, wenn die Anwendung beendet wird und Sie den Container entsorgen, sodass die Komponenten ordnungsgemäß freigegeben werden. Beachten Sie, dass der Container NIEMALS NIEMALS Ihre Anwendung darüber hinaus eingibt.

+1

perfekt. Gute Antwort. – InfoLearner

+0

Entschuldigung im verwirrt. Ich versuche, Instanzen zu registrieren, die ich in meiner Datenebene verwende, aber die Datenschicht kennt die unity.dlls nicht. Wenn ich sie in der Front-Ebene anmelde, sind der Front-Ebene die Klassen in der Daten-Ebene nicht bekannt. – InfoLearner

+0

@ fm55: Angenommen, Ihre Datenschicht benötigt eine "ISessionFactory" von NHibernate. Nehmen wir an, Ihr Anwendungsstamm erwartet, dass Sie eine 'ISessionFactory' übergeben. Also registrieren Sie 'ISessionFactory' mit Ihrem Container. Wenn Sie dann Ihren Anwendungsstamm auflösen, instanziiert er eine "ISessionFactory", die Ihr Anwendungsstammelement isst und an die Datenebene weitergibt. Wenn Ihre Anwendung den Container herunterfährt, wird die ISessionFactory für Sie aufgelöst. – jason

1

Es hängt alles davon ab, ob Sie Unity in der vorderen Ebene oder nur in der mittleren/hinteren Ebene verwenden. Wenn Sie im Back-End nur Unity verwenden, würden Sie die Unity-Konfigurationsdatei in dasselbe Verzeichnis wie die ausführbare Back-End-Datei stellen. Wenn Sie Unity auch am Frontend verwenden, benötigen Sie möglicherweise eine zweite Kopie der Konfigurationsdatei mit der ausführbaren Front-End-Datei, da sie unabhängig vom Back-End ist.

Jasons Ratschlag, nur auf Unity in der Bootstrapping-Methode zu verweisen, ist ein guter Ratschlag - daher wird die Konfigurationsdatei im selben Verzeichnis wie die ausführbare Serverdatei, die das Bootstrapping auslöst, und/oder im ausführbaren Verzeichnis der Client-Programmdatei benötigt das Bootstrapping.

In dem System, an dem ich derzeit arbeite, verwenden wir den gleichen Bootstrapping-Code (in einer Midlayer-DLL) sowohl auf dem Client als auch auf dem Server, da wir IoC in beiden verwenden. Dies bedeutet, dass sowohl die Client-EXE als auch unsere Server-EXE separate Kopien der Konfiguration benötigen.

+0

Ich versuche, Instanzen zu registrieren, die ich in meiner Datenschicht verwende, aber die Datenschicht ist sich der unity.dlls nicht bewusst. Wenn ich sie in der Front-Ebene anmelde, sind der Front-Ebene die Klassen in der Daten-Ebene nicht bekannt. Empfehlen Sie die Erstellung von drei Konfigurationsdateien, eine für jede Ebene und die Registrierung von Instanzen in ihnen – InfoLearner

Verwandte Themen