You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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层有很多类似的IXXXDALEfXXXDAL,可以通过扫描程序集自动注册,减少重复代码:

// 扫描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

火山引擎 最新活动