如何使用RegisterType(Type).As(Type)

本文关键字:Type As 何使用 RegisterType | 更新日期: 2023-09-27 18:29:23

我的MVC项目使用Autofac 3.0,我希望通过反射RegisterType。首先定义了一个类似IRegisterDemoRegisterDemo的无参数接口和实现。我试着在我的Application_Start方法中使用builder.RegisterType(typeof(RegisterDemo)).As(typeof(IRegisterDemo)),它成功了,但这不是我的目的。

我想定义一个像UseAutofacAttribute这样的属性来反映类型并使用RegisterType(ImplType).As(InterfaceType),当我在Application_Start中编写代码时,它起作用了,所以我构建了另一个项目来做这件事,并在我的MVC项目中引用了项目dll,在Application_Start中只运行一个静态方法,不幸的是它失败了。

所以我想知道原因以及如何改变?

如何使用RegisterType(Type).As(Type)

如果您想使您的注册属性为基础,我建议您使用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目录中的自定义代码生成的程序集
  • 其他顶级文件夹中的程序集