C# 自动将接口注册到autofac中的类

C# 自动将接口注册到autofac中的类,c#,autofac,C#,Autofac,我正在从事的项目中,每个类都有自己的接口,具有以下命名约定 ClassA.cs:IClassA.cs 类别B.cs:IClassB.cs 等 目前在Autofac的引导程序中,我反复强调 builder.RegisterType<ClassA>.As<IClassA>(); builder.RegisterType<ClassB>.As<IClassB>(); builder.RegisterType.As(); builder.Register

我正在从事的项目中,每个类都有自己的接口,具有以下命名约定

ClassA.cs:IClassA.cs

类别B.cs:IClassB.cs 等

目前在Autofac的引导程序中,我反复强调

builder.RegisterType<ClassA>.As<IClassA>();
builder.RegisterType<ClassB>.As<IClassB>();
builder.RegisterType.As();
builder.RegisterType.As();
有几个单身汉被扔来扔去

有没有办法自动化绑定过程?我知道手动添加绑定并不是一项巨大的额外工作,但我相信随着时间的推移,情况会变得更糟

我的容器中目前有以下内容

builder.RegisterType<MyClass>().As<IMyClass>().SingleInstance();

var myAss = Assembly.GetExecutingAssembly();
builder.RegisterAssemblyTypes(myAss)
   .Where(t => t.IsClass )
   .As(t => t.GetInterfaces().Single(i => 
   ( i.Name.Length == t.Name.Length + 1 ) && 
   ( i.Name == "I" + t.Name)));
builder.RegisterType().As().SingleInstance();
var myAss=Assembly.getExecutionGassembly();
builder.RegisterAssemblyTypes(myAss)
.Where(t=>t.IsClass)
.As(t=>t.GetInterfaces().Single(i=>
(i.Name.Length==t.Name.Length+1)和
(i.Name==“i”+t.Name));
然而,看看建筑商的观察窗口。看起来它可能要注册Myclass两次。现在我可能完全错了,因为我一辈子都无法在手表窗口找到在builder中注册的内容

如果我错了,请给我一巴掌

然而,看看建筑商的观察窗口。看起来它可能要注册Myclass两次

是的,这是正确的,因为您正在将类
MyClass
手动注册为singleton(第一行),并在
RegisterAssemblyTypes
调用中进行第二次注册

我认为,以这种方式注册所有类是相当危险的,因为每当您有一个没有实现接口的类,或者如果接口不符合您的命名约定,注册都会失败。像这样做

builder.RegisterAssemblyTypes(myAss)
   .Where(t => t.Name.EndsWith("Repository"))
   .AsImplementedInterfaces();

如图所示,这可能会更加健壮。如果你只是想注册所有的类,你可以跳过
Where
部分。

看看文档中的自动扫描不是
。AsImplementedInterfaces()
你要找的是什么?这确实可以作为部分处理。但它不能处理某些接口注册为singleton的要求。我看过ACTNAR的东西,但看不出它是将类注册到它自己,还是它的接口。如果只是对它自己,就看不到任何方法使它注册到接口。谢谢,AsImplementedInterfaces位肯定比我之前做的要好。但不确定这是否解决了拥有一定数量的单例实例的问题,因为仅此实现不会将它们注册为单例,并且在注册两次的类中仍然Resultl的上方添加单独的寄存器。查看在线Doumation,看起来唯一能让singleton实例保持某种安全性的方法是先执行它们,然后添加.PreserveExistingDefaults();之后AsImplementedInterfaces@user3265613是的,只要注册数相等,使用
保留现有默认值
应该可以正常工作。如果您的
MyClass
实现了另一个在注册singleton时未显式注册的接口,则由于调用
AsImplementedInterfaces
的缘故,您的
MyClass
类将在第二个接口上进行另一次注册。