C# Autofac寄存器程序集类型

C# Autofac寄存器程序集类型,c#,asp.net-web-api,castle-windsor,autofac,C#,Asp.net Web Api,Castle Windsor,Autofac,在Castle中,我通常执行以下操作来注册来自不同程序集的类型: Classes.FromAssemblyNamed("MyServer.DAL") .Where(type => type.Name.EndsWith("Repository")) .WithServiceAllInterfaces() .LifestylePerWebRequest(), 在Autofac中,我将上述代码更改为: builder.RegisterAssemblyT

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

对于您拥有的每个程序集,获取属于该程序集的单个类型并从中检索程序集的链接。然后将此链接馈送给生成器。重复。

您可以将
用作
的谓词重载!
您可以从以
“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.GetAssembly不返回依赖项目的程序集。这里有详细的解释

在这些情况下,我们应该使用项目中的任何类分别获取这些项目程序集,并注册其类型

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

当你运行它时,它能工作吗?代码编译并执行,但我认为它不正确,因为我不能再访问我的api了(错误500)。可能有帮助