web-dev-qa-db-ja.com

Autofacレジスタアセンブリタイプ

キャッスルでは、私は別のアセンブリからタイプを登録するために以下を使用していました:

Classes.FromAssemblyNamed("MyServer.DAL")
       .Where(type => type.Name.EndsWith("Repository"))
       .WithServiceAllInterfaces()
       .LifestylePerWebRequest(),

Autofacでは、上記のコードを次のように変更します。

builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies())
       .Where(t => t.Name.EndsWith("Repository"))
       .InstancePerRequest();

それが正しいか?

19

これは正しい方法です:

builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies())
       .Where(t => t.Name.EndsWith("Repository"))
       .AsImplementedInterfaces()
       .InstancePerRequest();
25

UWPの場合、正しい方法は少し変更されます。

   var assemblyType = typeof(MyCustomAssemblyType).GetTypeInfo();

   builder.RegisterAssemblyTypes(assemblyType.Assembly)
   .Where(t => t.Name.EndsWith("Repository"))
   .AsImplementedInterfaces()
   .InstancePerRequest();

アセンブリごとに、アセンブリに属する​​単一のタイプを取得し、そこからアセンブリのリンクを取得します。次に、このリンクをビルダーにフィードします。繰り返す。

3
Ingerdev

AppDomain.CurrentDomain.GetAssembliesが依存プロジェクトのアセンブリを返さない場合があります。詳細な説明はこちら AppDomain.GetAssembliesとBuildManager.GetReferencedAssembliesの違い

そのような場合は、プロジェクト内のクラスを使用してそれらのプロジェクトアセンブリを個別に取得し、その型を登録する必要があります。

var webAssembly = Assembly.GetExecutingAssembly();
var repoAssembly = Assembly.GetAssembly(typeof(SampleRepository)); // Assuming SampleRepository is within the Repository project
builder.RegisterAssemblyTypes(webAssembly, repoAssembly)
            .AsImplementedInterfaces();          
0
sydeng

Asの述語オーバーロードを使用できます。 "Repository"で終わる特定のタイプからGetInterfacesのすべてのインターフェースを取得し、それらが実装する最初のインターフェースを選択して登録できます。

var Assembly = Assembly.GetExecutingAssembly();
ContainerBuilder builder = new ContainerBuilder();

builder.RegisterAssemblyTypes(Assembly)
    .Where(t => t.Name.EndsWith("Repository"))
    .As(t => t.GetInterfaces()[0]);
0
Shahar Shokrani