So registrieren Sie diese Klasse in Autofac

8

Ich verwende Autofac als Ioc Container. Ich habe drei Klassen:

%Vor%

Der Service und das Repository benötigen die gleiche Instanz von UnitOfWork

Wie geht das? und Wie man es in XmlConfiguration

wirte     
DotDot 26.07.2012, 02:34
quelle

1 Antwort

30

BEARBEITEN: Ich habe das falsch verstanden und dachte, es sei eine Frage, wie man mit Hilfe von Autofac Abhängigkeiten registrieren kann. Wenn Sie dasselbe UnitOfWork beibehalten möchten, müssen Sie die Lebensdauer der Instanz auf etwas beschränken. Wenn Sie dies in einer ASP.NET- oder WCF-Anwendung verwenden, können Sie Ihre Abhängigkeiten wie folgt registrieren:

%Vor%

Zuerst müssen Sie alle Ihre Abhängigkeiten registrieren, um einen Container wie Autofac zu verwenden. In Autofac kannst du das auf verschiedene Arten tun, aber alle benutzen die a ContainerBuilder . Der ContainerBuilder basiert auf Erweiterungsmethoden, stellen Sie daher sicher, dass Sie eine using -Anweisung für den Autofac-Namespace haben.

Sie können die Factory-Methoden explizit definieren:

%Vor%

Mit ContainerBuilder greifen wir auf die Register<>() -Methode zu, um die Service-Schnittstelle bereitzustellen (so werden wir den Container nach dem Service fragen). In diesem Fall verwende ich keine Interfaces, nur den eigentlichen Typ. Jedes Mal, wenn Sie den Container nach einem UnitOfWork fragen, wird die Factory-Methode new UnitOfWork() verwendet, um einen zu generieren. Im wirklichen Leben würden Sie wahrscheinlich nach einem IUnitOfWork fragen. Dies kann alles ein wenig ausführlich sein, aber es ist sehr praktisch, wenn Sie benutzerdefinierte Logik für die Erstellung von Abhängigkeiten benötigen.

Sie können den Builder wie jeden anderen Abhängigkeitscontainer verwenden und nur die Typen registrieren.

%Vor%

Bei diesem Ansatz werden alle Abhängigkeiten registriert, die zum Aufbau einer Klasse erforderlich sind. Der Container verwendet dann die Reflektion, um alle Konstruktorargumente aufzulösen. Wenn ein Argument nicht registriert ist, löst der Container eine Ausnahme mit dem Typ aus, der nicht aufgelöst werden konnte. In diesem Fall hängt der Service von UnitOfWork und Repository ab. Repository hat auch eine Abhängigkeit von UnitOfWork . Diese Abhängigkeiten werden als Konstruktorargumente ausgedrückt. Um einen Repository oder einen Service aus dem Container anzufordern, müssen alle Abhängigkeiten registriert sein

Sie können den Konfigurationsansatz verwenden.

Wenn Sie eine app.config-Datei verwenden, können Sie Ihre Konfigurationsdatei wie folgt definieren:

%Vor%

Beachten Sie zuerst, dass wir einen Konfigurationsabschnitt definieren müssen (beachten Sie den <ConfigSections> ). Dann können wir einen Abschnitt <autofac> erstellen, der alle unsere Abhängigkeiten definiert. Die Notation ist ziemlich einfach, Sie erstellen im Grunde eine <component> für jede Abhängigkeit. Jede Komponente hat ein Attribut service , das den Typ definiert, der angefordert wird. Es gibt auch ein Attribut type , das das Objekt definiert, das erstellt werden soll, wenn eine Instanz des Dienstes angefordert wird. Dies ist analog zu builder.Register<UnitOfWork>(b => new UnitOfWork()) , wobei UnitOfWork der angeforderte Dienst (und in diesem Fall auch der zu erstellende Typ) ist.

Um den Builder mithilfe der Konfiguration zu erstellen, verwenden Sie ConfigurationSettingsReader()

%Vor%

Sie müssen den Namen Ihres Konfigurationsabschnitts eingeben (in diesem Fall autofac ). Sobald Sie die Abhängigkeiten konfiguriert haben, müssen Sie einen Container erstellen. Das ContainerBuilder enthält eine Methode, um dies zu tun:

%Vor%

Und sobald Sie den Container haben, können Sie Instanzen Ihres Dienstes anfordern:

%Vor%

Komplettes Programm:

%Vor%     
JaySilk84 26.07.2012 03:58
quelle