簡體   English   中英

Autofac寄存器組件類型

[英]Autofac register assembly types

在Castle中,我曾經做過以下操作來注冊來自不同程序集的類型:

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

這是對的嗎?

這是正確的方法:

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

對於UWP,正確的方法有點改變:

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

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

對於每個程序集,您已采用屬於程序集的單一類型並從中檢索程序集的鏈接。 然后飼料生成器此鏈接。 重復。

你可以使用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]);

有時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();          

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM