我之前看到过无需显式注入接口的实现,创建接口时可以简单地继承例如接口“IamContainerRegistered”,并在编译时注入接口
抱歉,我没有代码可以提供,我不确定从哪里开始,但感谢帮助。
因此,在伪类中,对于每个由 IAmContainerRegistered 继承的接口:
builder.RegisterType<ClassName>().As<InterfaceName>().InstancePerRequest();
(使用 AutoFac)
举例来说,我有
ITest1 : IAmContainerRegistered
... ITest2 : IAmContainerRegistered
这将产生:
builder.RegisterType<Test1>().As<ITest1>().InstancePerRequest();
builder.RegisterType<Test2>().As<ITest2>().InstancePerRequest();
您可以使用程序集扫描和过滤来获取实现
IAmContainerRegistered
的所有类型
var asm = Assembly.GetExecutingAssembly();
var builder = new ContainerBuilder();
builder.RegisterAssemblyTypes(asm)
.Where(t => t.IsAssignableTo<IAmContainerRegistered>())
.AsImplementedInterfaces();
var c = builder.Build();
var t1 = c.Resolve(typeof(ITest1)); //Test1
var t2 = c.Resolve(typeof(ITest2)); //Test2
var unwanted = c.Resolve(typeof(IAmContainerRegistered)); //Test2
缺点:使用
AsImplementedInterfaces()
代替显式接口名称,因此 IAmContainerRegistered
接口也将被注册(请参阅示例中的 unwanted
解决方案。