2016-05-20 7 views
2

Also Im Autofac in einem MVC verwenden, so dass meine Controller können Abhängigkeiten dort Konstruktor injiziert haben, habe ich in meinem Global.asax Ich habe den folgenden Code-Schnipsel, der funktioniert.Verwenden von Autofac Registrierung alles, was mit Service endet

// Register your MVC controllers. 
builder.RegisterControllers(typeof(MvcApplication).Assembly); 

builder.RegisterType<PurchaseOrderSearchService>().As<IPurchaseOrderSearchService>().WithParameter("context", new PurchaseOrderManagerContext()); 

// Set the dependency resolver to be Autofac. 
var container = builder.Build(); 
DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 

Das Problem ist, ich will nicht builder.RegisterType immer und immer wieder tun, für alle meine Leistungen. Wie mache ich das?

ich denke, die Art von Sache, die ich will, ist

builder.RegisterAssemblyTypes(foo) 
    .Where(t => t.Name.EndsWith("Services")) 
    .WithParameter("context", new PurchaseOrderManagerContext()); 

Aber keine Ahnung, was sollte foo sein. Oder wenn RegisterAssemblyTypes richtig ist. Ich weiß Codierung nach Konvention ist die Lösung, aber nicht sicher, was die Konvention ist. Alle meine Dienste int Wort Dienst beenden und muss Schnittstelle

so wird FooService Schnittstelle IFooService haben und Barservice werden Schnittstelle IBarService haben

auch darauf hinweisen, dass alle Dienste in einer Klassenbibliothek leben genannt PurchaseOrderManager. Service

Antwort

5

Sie sind auf dem richtigen Weg. „Foo“ sollte die Montage der Typen enthält, registrieren - wenn Sie eine einzelne Baugruppe verwenden, dann sollten folgende Arbeiten:

builder.RegisterAssemblyTypes(typeof(MvcApplication).Assembly) 
    .Where(t => t.Name.EndsWith("Services")) 
    .WithParameter("context", new PurchaseOrderManagerContext()) 
    .AsImplementedInterfaces(); 

Die .AsImplementedInterfaces() benötigt wird, um sie als IFooService registrieren - ohne sie, sie würden nur registriert werden, wie FooService usw.

Wenn Ihre Klassen in einer separaten Assembly leben, würde ich normalerweise empfehlen Sie ein Autofac Modul innerhalb dieser Baugruppe definieren:

public class ServiceModule : Module 
{ 
    protected override void Load(ContainerBuilder builder) 
    { 
     // "ThisAssembly" means "any types in the same assembly as the module" 
     builder.RegisterAssemblyTypes(ThisAssembly) 
      .Where(.... 
    } 
} 

Dann registrieren dies in Ihrer Web-Anwendung:

builder.RegisterModule<PurchaseOrderManager.Service.ServiceModule>(); 

Alternativ meinen ursprünglichen Vorschlag verwenden, aber ausdrücklich die Anordnung enthält, die Dienste an:

builder.RegisterAssemblyTypes(typeof(PurchaseOrderManager.Service.FooService).Assembly) 
    .Where(t => t.Name.EndsWith("Services")) 
    .WithParameter("context", new PurchaseOrderManagerContext()) 
    .AsImplementedInterfaces(); 

Sie müssen nur jede Klasse wählen, das in dieser Versammlung besteht.

+0

Prost, ich denke, das ist, was ich will ... aber ich habe alle Dienste leben in einer Klassenbibliothek namens PurchaseOrderManager.Service ist so werfen Fehler Keine der Konstruktoren gefunden mit 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder 'on type' PurchaseOrderManager.Controllers.PurchaseOrderSearchController 'kann mit den verfügbaren Diensten und Parametern aufgerufen werden: Der Parameter' PurchaseOrderManager.Service.Services.Interfaces.IPurchaseOrderSearchService 'des Konstruktors' Void .ctor (PurchaseOrderManager.Service.Services.Interfaces .IPurchaseOrderSearchService) '. –

+0

Antwort aktualisiert. – Richard

+0

Ich ging mit dem Autofac-Modell. Ich habe geschützt override void Load (ContainerBuilder builder) { // "ThisAssembly" bedeutet "jede Art in der gleichen Anordnung wie das Modul" builder.RegisterAssemblyTypes (ThisAssembly) .Where (t => t.Name.EndsWith ("Services")) .WithParameter ("context", neuer PurchaseOrderManagerContext()) .AsImplementedInterfaces(); } Aber das wird nie aufgerufen werden, da es nichts als eine Klassenbibliothek überschreiben –

Verwandte Themen