首页 > 解决方案 > 用于许多接口实现的 Autofac 注册

问题描述

我有几个需要在 Autofac 中注册的接口实现,但是我无法找到一种方法将它们全部一起完成,而不是像我目前拥有的那样单独完成:

builder.RegisterType<UserDefinedRepository<CType>>().As<IUserDefinedRepository<CType>>();
builder.RegisterType<UserDefinedRepository<LType>>().As<IUserDefinedRepository<LType>>();

两者都CType具有LType相同的基类型,并且接口和类实现的Type参数有相同类型的限制。

我已经阅读了很多有关 Autofac 实现的示例,但是对于我正在尝试做的事情来说,大多数示例似乎都太复杂了,而且文档也不是很有帮助(无论如何,根据我对它的理解!)。

我已经注册了多年来一直运行良好的所有其他存储库,但它们都有接口的具体实现:

var baseRepoType = typeof(InfraAbsRepos.IRepository);
builder.RegisterAssemblyTypes(Assembly.Load("Infrastructure.Repositories"))
    .Where(t => baseRepoType.IsAssignableFrom(t))
    .AsImplementedInterfaces()
    .InstancePerRequest();

标签: c#genericsautofac

解决方案


AsClosedTypesOf按照文档中的说明尝试。

builder.RegisterAssemblyTypes(Assembly.Load("Infrastructure.Repositories"))
       .AsClosedTypesOf(typeof(IUserDefinedRepository<>))
       .InstancePerRequest();

根据您要执行的操作,您可能需要添加一个Where子句来过滤程序集类型列表;AsImplementedInterfaces和/或如果您需要注册更多接口或类型,您可能想要添加一个。

如果没有足够的灵活性,RegisterAssemblyTypes您始终可以使用反射自己迭代加载的类型集,并可能将其与Autofac 中的一些开放通用注册支持结合起来。


推荐阅读