C# Autofac寄存器程序集类型
在Castle中,我通常执行以下操作来注册来自不同程序集的类型: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
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)。可能有帮助