我有一些接口的实现,需要在Autofac中进行注册,但是我很难找到一种方法来将它们全部在一起而不是像现在这样单独地进行:
builder.RegisterType<UserDefinedRepository<CType>>().As<IUserDefinedRepository<CType>>();
builder.RegisterType<UserDefinedRepository<LType>>().As<IUserDefinedRepository<LType>>();
CType
和LType
都具有相同的基本类型,而Interface和class实现的Type参数具有相同的限制。
我已经阅读了很多有关Autofac实现的示例,但是对于我想做的事情,大多数示例似乎太复杂了,而且文档也不是很有帮助(从我的理解来看!)。
我已经对所有其他存储库进行了注册,这些注册库已经运行了很多年,但是它们都有接口的具体实现:
var baseRepoType = typeof(InfraAbsRepos.IRepository);
builder.RegisterAssemblyTypes(Assembly.Load("Infrastructure.Repositories"))
.Where(t => baseRepoType.IsAssignableFrom(t))
.AsImplementedInterfaces()
.InstancePerRequest();
答案 0 :(得分:1)
尝试将AsClosedTypesOf
设置为noted in the documentation。
builder.RegisterAssemblyTypes(Assembly.Load("Infrastructure.Repositories"))
.AsClosedTypesOf(typeof(IUserDefinedRepository<>))
.InstancePerRequest();
根据要执行的操作,可能需要添加Where
子句以过滤程序集类型列表;和/或如果您需要注册更多的接口或类型,则可能要添加AsImplementedInterfaces
。
如果RegisterAssemblyTypes
中没有足够的灵活性,您总是可以自己使用反射来遍历加载的类型集,也可以将其与某些open generic registration support in Autofac结合使用。