我有几个接口的实现,我需要在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();
试试AsClosedTypesOf
作为noted in the documentation。
builder.RegisterAssemblyTypes(Assembly.Load("Infrastructure.Repositories"))
.AsClosedTypesOf(typeof(IUserDefinedRepository<>))
.InstancePerRequest();
根据您要查看的内容,您可能需要添加Where
子句来过滤程序集类型列表;和/或如果您需要注册更多接口或类型,您可能需要添加AsImplementedInterfaces
。
如果RegisterAssemblyTypes
没有足够的灵活性,你可以使用反射自己迭代加载的类型集,也许可以将它与一些open generic registration support in Autofac结合起来。