2016-05-20 5 views
2

MVCでautofacを使用しているので、私のコントローラにコンストラクタが組み込まれている場合、Global.asaxに次のようなコードがあります。Autofacを使用してサービスを終了するものをすべて登録する

// 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)); 

問題は、私はすべての私のサービスのために、何度も何度もbuilder.RegisterTypeを行うにはしたくないです。だから私はそれをどうやってやるの?

私は私が望むものの種類が

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

しかし、fooがどうあるべきか全く分からないと思います。または、RegisterAssemblyTypesが正しい方法である場合 私は慣例によるコーディングが解決策であることを知っていますが、慣習が何であるかはわかりません。 すべての私のサービスがintワードサービスを終了しますので、FooServiceは、インタフェースIFooService を持つことになりますし、BarServiceはインタフェースIBarService

を持っていますインターフェース

を持っていますまた、すべてのサービスがPurchaseOrderManagerと呼ばれるクラスライブラリに住んでいることを指摘しなければなりません。サービス

答えて

5

あなたは正しい道を歩いています。 「Fooのは、」登録する型を含むアセンブリでなければなりません - あなたは、単一のアセンブリを使用している場合は、次の作業をする必要があります:.AsImplementedInterfaces()IFooServiceとして登録するために必要とされる

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

- それなしで、彼らが唯一の希望

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(.... 
    } 
} 

からログイン:あなたのクラスは別のアセンブリに住んでいる場合、私は通常、あなたがそのアセンブリ内autofacモジュールを定義推薦FooServiceなどとして

を登録しますこのWebアプリケーションで:

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

、私のオリジナルの提案を使用しますが、明示的にサービスを含むアセンブリを指定します。

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

はちょうどそのアセンブリ内に存在する任意のクラスを選択する必要があります。

+0

私はそれが私が望むものだと思うが、私はすべてのサービスをPurchaseOrderManager.Serviceというクラスライブラリに入れているので、エラーを投げている 'Autofac.Core.Activators.Reflection.DefaultConstructorFinderで見つかったコンストラクタはありません'型' PurchaseOrderManager.Controllers.PurchaseOrderSearchController 'は、利用可能なサービスとパラメータを使用して呼び出すことができます: コンストラクタの' PurchaseOrderManager.Service.Services.Interfaces.IPurchaseOrderSearchServiceサービス 'パラメータを解決できません' Void .ctor(PurchaseOrderManager.Service.Services.Interfaces .IPurchaseOrderSearchService) 'を選択します。 –

+0

回答が更新されました。 – Richard

+0

私はオートファックモデルを使いました。私はprotected overrideを持っています。void Load(ContainerBuilder builder) { // "thisAssembly"は "モジュールと同じアセンブリ内のすべての型"を意味します builder.RegisterAssemblyTypes(ThisAssembly) .Where(t => t.Name.EndsWith "Services")) .WithParameter( "context"、新しいPurchaseOrderManagerContext()) 。AsImplementedInterfaces(); }しかし、これはクラスlibaryとして何もオーバーライドしていないので、呼び出されることはありません –

関連する問題