2012-04-04 15 views
3

Nehmen wir an, Sie arbeiten an einem ASP.NET MVC-Projekt und es handelt sich um Schichten, die in einer einzigen Lösung in verschiedene Projekte aufgeteilt werden. Jedes Projekt verfügt über Autofac-Module, die zum Verdrahten der Abhängigkeiten erstellt wurden. Jetzt möchte ich die Baugruppen scannen und alle Module in den Container registrieren.Scannen von Autofac-Modulen für verschiedene Anwendungen

I angepasst, um eine Erweiterungsmethode ähnlich das, was http://goo.gl/VJEct

public static void RegisterAssemblyModules(this ContainerBuilder builder, Assembly 
assembly) 
{ 
    var scanningBuilder = new ContainerBuilder(); 

    scanningBuilder.RegisterAssemblyTypes(assembly) 
    .Where(t => typeof(IModule).IsAssignableFrom(t)) 
    .As<IModule>(); 

    using (var scanningContainer = scanningBuilder.Build()) 
    { 
    foreach (var m in scanningContainer.Resolve<IEnumerable<IModule>>()) 
     builder.RegisterModule(module); 
    } 
} 

Meine erste Frage hier geteilt wurde, wenn man bedenkt, dass diese Probe vor einigen Jahren zur Verfügung gestellt wurde, ist dies immer noch ein machbares Konstrukt mit aktuellen Versionen von verwenden, Autofac?

Zweitens hängt die MVC-App von der Funktionalität in den anderen Schichten ab, was bedeutet, dass ich manchmal Typen mit .InstancePerHttpRequest() registrieren müsste. Allerdings hätte ich auch gerne die Möglichkeit, sie aus Nicht-Web-Anwendungen zu referenzieren und keine Abhängigkeit von System.Web zu nehmen. Was ist der beste Ansatz, um Module zu registrieren, die in diesen verschiedenen Kontexten verwendet werden können?

+0

Vor fast einem Jahr ... aber immer noch neugierig. Haben Sie es geschafft, Ihre MVC-App-Module schön zu verkabeln, ohne dass Sie mvc referenzieren müssen, und dass Sie sie im Lebensdauersicht einer HTTP-Anfrage immer noch richtig verwenden könnten? Ich habe gerade die gleiche Situation wie du. Optionen sind: Alle Modulregistrierungen in Webprj oder Modulregistrierung in jeder Baugruppe ... –

+0

Bisher habe ich den Ansatz der Module in jeder Baugruppe wo nötig genommen. Seit diesem Post hat Autofac eine RegisterAssemblyModules-Erweiterungsmethode in ihre Core-DLL aufgenommen. https://code.google.com/p/autofac/wiki/Scanning#Module_Scanning. Für die Projekte, die keine Webkomponenten referenzieren, habe ich in den meisten Fällen die Registrierung von Komponenten als InstancePerDependency() durchgeführt. Ich versuche, eine große Registrierung im Hauptprojekt zu vermeiden. Ich finde, dass Sie auf diese Weise ein wenig Flexibilität aufgeben oder sogar mit einem "unordentlicheren" Registrierungsaufbau aufwarten können. – cecilphillip

+0

Ok. Gute Info. Problem ist (für meinen Fall), wenn Sie Entity Framework DBContexts registrieren (ich DDD mit mehreren beschränkten Kontexten) und sie in Repositories injizieren möchte, wollen Sie, dass sie Lifetimescope als Webrequest haben. Dies führt dazu, dass ich auf AutoFac (das ist ok), AutoFac MVC-Integration (Hmm .. vielleicht ok) und MVC Web prj (nicht OK) referenziere. Bei den anderen Komponenten in unserem Projekt habe ich den Gültigkeitsbereich der Lebensdauer nicht angegeben, daher sind sie PerDependency. Ich entdeckte tatsächlich, dass ich meinen DBContext mit InstancePerMatchingLifetimeScope verdrahten konnte ("AutofacWebRequest"). Ich weiß, dass es eine hässliche Referenz ist. –

Antwort

0

Ich würde die Module im Container nicht registrieren. Ich sehe keinen Grund, das zu tun.

Hier ist ein alternative.

Es verwendet Activator.CreateInstance, um die Module zu erstellen und sie im Builder zu registrieren.

Das gleiche Framework bietet Ihnen auch Unterstützung für die Konfiguration kostenlose Registrierung. Fügen Sie einfach ein Attribut auf Ihre Dienste:

[Component] 
public class MyService : IService 
{ 
} 

Und die Baumeister-Extension-Methode ausführen:

builder.RegisterAllComponents(Assembly.GetExecutingAssembly()); 
+0

in Ihrem Link, die RegisterModules-Methode ist etwas länger die Linien von dem, was ich tun würde, aber anstelle der integrierten Autofac-Module unterstützen Sie erstellen Sie Ihre eigenen. – cecilphillip

Verwandte Themen