基于继承的C# Autofac自动依赖注入实现方法咨询
实现Autofac自动注册继承IAmContainerRegistered的接口
核心思路
用一个空的标记接口IAmContainerRegistered来标识需要自动注册的接口,程序启动时扫描程序集,找出所有继承该接口的接口,再匹配对应的实现类(默认按接口名去掉首字母"I"的规则查找,比如ITest1对应Test1),最后批量注册到Autofac容器,省去手动编写每条注册语句的麻烦。
具体步骤
1. 定义标记接口
先创建一个空接口作为标记:
public interface IAmContainerRegistered { // 空接口,仅用作标记 }
2. 编写自动注册逻辑
在配置Autofac容器的位置,添加扫描和批量注册的代码:
var builder = new ContainerBuilder(); // 扫描当前程序集,需扫描多个程序集时,可添加其他Assembly实例 var assembly = Assembly.GetExecutingAssembly(); // 筛选出所有继承IAmContainerRegistered的接口 var targetInterfaces = assembly.GetTypes() .Where(t => t.IsInterface && t.IsAssignableTo(typeof(IAmContainerRegistered))); foreach (var @interface in targetInterfaces) { // 按规则生成实现类名称:接口名去掉首字母"I" var implTypeName = @interface.Name.Substring(1); var implType = assembly.GetType($"{@interface.Namespace}.{implTypeName}"); if (implType != null && !implType.IsAbstract) { // 注册实现类为对应接口,生命周期使用InstancePerRequest(适用于Web场景) builder.RegisterType(implType) .As(@interface) .InstancePerRequest(); } } // 其他手动注册的业务代码可放在此处... var container = builder.Build();
3. 示例验证
创建符合命名规则的接口和实现类:
// 接口继承标记接口 public interface ITest1 : IAmContainerRegistered { void DoSomething(); } public class Test1 : ITest1 { public void DoSomething() { // 业务逻辑实现 } } public interface ITest2 : IAmContainerRegistered { void DoAnotherThing(); } public class Test2 : ITest2 { public void DoAnotherThing() { // 业务逻辑实现 } }
启动程序后,Autofac会自动完成Test1对应ITest1、Test2对应ITest2的注册,无需手动编写两条RegisterType语句。
额外注意事项
- 如果实现类命名不遵循"去掉首字母I"的规则,需要调整
implTypeName的生成逻辑,比如通过自定义特性标记实现类,或者修改命名匹配规则 - 非Web项目请勿使用
InstancePerRequest,可替换为InstancePerDependency(每次请求生成新实例)或其他适合的生命周期 - 需扫描多个程序集时,可添加
Assembly.Load("YourAssemblyName")到扫描集合中
内容的提问来源于stack exchange,提问作者lanes123
相关产品推荐
相关产品推荐

