我的MVC项目使用Autofac 3.0,我希望通过反射RegisterType
。首先定义了一个类似IRegisterDemo
和RegisterDemo
的无参数接口和实现。我试着在我的Application_Start
方法中使用builder.RegisterType(typeof(RegisterDemo)).As(typeof(IRegisterDemo))
,它成功了,但这不是我的目的。
我想定义一个像UseAutofacAttribute
这样的属性来反映类型并使用RegisterType(ImplType).As(InterfaceType)
,当我在Application_Start
中编写代码时,它起作用了,所以我构建了另一个项目来做这件事,并在我的MVC项目中引用了项目dll,在Application_Start
中只运行一个静态方法,不幸的是它失败了。
所以我想知道原因以及如何改变?
如果您想使您的注册属性为基础,我建议您使用Autofac的MEF适配器。它将让您用ExportAttribute
装饰您的类型,并被您的ContainerBuilder
拾取。
示例
[Export(typeof(IRegisterDemo))] // <-- This exports RegisterDemo as IRegisterDemo
public class RegisterDemo : IRegisterDemo { }
// Example method to register assemblies with ContainerBuilder
public void RegisterPartsFromReferencedAssemblies(ContainerBuilder builder)
{
// Get referenced assemblies
var assemblies = BuildManager.GetReferencedAssemblies().Cast<Assembly>();
// Create an AssemblyCatalog from each assembly
var assemblyCatalogs = assemblies.Select(x => new AssemblyCatalog(x));
// Combine all AssemblyCatalogs into an AggregateCatalog
var catalog = new AggregateCatalog(assemblyCatalogs);
// Register the catalog with the ContainerBuilder
builder.RegisterComposablePartCatalog(catalog);
}
此示例显示如何导出类型以及如何使用ContainerBuilder
注册引用的程序集。然后,您可以执行container.Resolve<IRegisterDemo>()
来获得导出的部分(或者将其注入到类中)。
注意:这将注册所有引用组件的导出零件,包括:
- Web.config文件的assembly元素中指定的程序集
- 根据App_code目录中的自定义代码生成的程序集
- 其他顶级文件夹中的程序集