Autofac:如何注册含业务层抽象类的分层架构
基于Autofac注册你的分层架构方案
首先,咱们先梳理下你的架构依赖关系:IDepartmentDAL 继承自 IDataAccess<DPT_DEPARTMENT>,而 EfDepartmentDAL 继承泛型基类 EfEntityRepositoryBase<DPT_DEPARTMENT, YourDbContext>(这里把你提到的C...假设成具体的DbContext,比如CompanyDbContext),同时实现了IDepartmentDAL。针对这个结构,Autofac的注册可以分几个步骤来做,既支持手动逐个注册,也能批量扫描简化操作:
1. 先注册DbContext
因为你的泛型Repository基类依赖DbContext实例,所以首先得把DbContext注册到容器里,生命周期建议根据项目类型选择:
- 如果是ASP.NET Core项目,用
InstancePerLifetimeScope对应每个请求的生命周期; - 传统ASP.NET可以用
InstancePerRequest。
示例代码:
var builder = new ContainerBuilder(); // 替换成你实际的DbContext类型 builder.RegisterType<CompanyDbContext>() .AsSelf() .InstancePerLifetimeScope();
2. 注册泛型Repository基类
EfEntityRepositoryBase<TEntity, TContext> 是所有DAL实现的基类,并且实现了IDataAccess<TEntity>,我们可以用Autofac的泛型注册功能,一次性处理所有基于这个基类的泛型实现:
// 注册泛型基类,映射到IDataAccess<T>接口 builder.RegisterGeneric(typeof(EfEntityRepositoryBase<,>)) .As(typeof(IDataAccess<>)) .InstancePerLifetimeScope();
3. 注册具体的DAL接口与实现
这一步有两种方式:
方式一:手动逐个注册
如果你的DAL类不多,或者需要对某些特定DAL做特殊配置(比如指定不同的生命周期),可以手动注册:
// 注册部门DAL:将IDepartmentDAL映射到EfDepartmentDAL builder.RegisterType<EfDepartmentDAL>() .As<IDepartmentDAL>() .InstancePerLifetimeScope();
方式二:批量扫描注册
如果你的DAL层有很多类似的IXXXDAL和EfXXXDAL,可以通过扫描程序集自动注册,减少重复代码:
// 扫描DAL所在的程序集(这里用IDepartmentDAL的程序集作为入口) builder.RegisterAssemblyTypes(typeof(IDepartmentDAL).Assembly) // 筛选所有名称以"DAL"结尾的类 .Where(t => t.Name.EndsWith("DAL")) // 自动注册类实现的所有接口 .AsImplementedInterfaces() .InstancePerLifetimeScope();
关键注意点
- 当你解析
IDataAccess<DPT_DEPARTMENT>时,因为EfDepartmentDAL实现了IDepartmentDAL(而IDepartmentDAL继承自IDataAccess<DPT_DEPARTMENT>),Autofac会优先返回EfDepartmentDAL的实例(而不是泛型基类的实例),这符合我们的业务需求——优先使用具体的DAL实现。 - 生命周期的选择要统一,避免因为生命周期不匹配导致的DbContext实例问题,建议所有DAL和DbContext使用相同的生命周期。
内容的提问来源于stack exchange,提问作者cpzz




