.NET Core 2.0数据访问层依赖注入(DI)问题求助
解决.NET Core 2.0中DAL层BaseEngine构造函数依赖注入的问题
嘿,我懂你现在的困扰——把EF Core从表现层移到DAL层后,BaseEngine的构造函数需要参数,不想手动一个个实例化对吧?别担心,.NET Core的DI容器完全能帮你搞定这个,下面是具体的步骤和代码示例:
1. 先把BaseEngine的依赖注册到DI容器
首先,BaseEngine构造函数需要的参数(比如你的EF Core DbContext)必须先在DI容器里注册好。打开Startup.cs的ConfigureServices方法,先完成DbContext的注册:
public void ConfigureServices(IServiceCollection services) { // 以SqlServer为例注册你的DbContext services.AddDbContext<YourDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); }
2. 让BaseEngine通过构造函数接收依赖
调整你的BaseEngine类,用构造函数注入需要的依赖,绝对不要在内部手动创建实例:
public abstract class BaseEngine { protected readonly YourDbContext _dbContext; // 构造函数注入DbContext,同时做非空校验 public BaseEngine(YourDbContext dbContext) { _dbContext = dbContext ?? throw new ArgumentNullException(nameof(dbContext)); } // 你的通用引擎方法,比如通用查询、新增逻辑 public virtual async Task<T> GetByIdAsync<T>(int id) where T : class { return await _dbContext.Set<T>().FindAsync(id); } }
3. 派生引擎类传递依赖给基类
你的具体DAL引擎(比如ProductEngine)要通过自己的构造函数,把依赖传递给BaseEngine的构造函数:
public class ProductEngine : BaseEngine { // 如果有额外的依赖,也可以在这里添加并注入 public ProductEngine(YourDbContext dbContext) : base(dbContext) { } // 产品相关的自定义业务方法 public async Task<List<Product>> GetActiveProductsAsync() { return await _dbContext.Products.Where(p => p.IsActive).ToListAsync(); } }
4. 把DAL引擎注册到DI容器
回到Startup.cs,把你的具体引擎类(或者通用引擎)注册到DI容器,生命周期建议和DbContext保持一致,用Scoped:
public void ConfigureServices(IServiceCollection services) { // 先注册DbContext... // 注册具体的引擎类 services.AddScoped<ProductEngine>(); // 如果是通用引擎,注册泛型类型 services.AddScoped(typeof(IBaseEngine<>), typeof(BaseEngine<>)); }
5. 在表现层直接注入使用
现在你可以在Controller或者其他服务里直接注入你的DAL引擎,DI容器会自动帮你创建实例并传入所有需要的依赖,完全不用手动new:
public class ProductController : Controller { private readonly ProductEngine _productEngine; public ProductController(ProductEngine productEngine) { _productEngine = productEngine; } public async Task<IActionResult> Index() { var products = await _productEngine.GetActiveProductsAsync(); return View(products); } }
这样一来,所有依赖的解析和实例化都交给DI容器处理,你只需要专注于业务逻辑就好。后续如果要添加新的依赖,只要在构造函数里加参数,再把新依赖注册到DI容器就行。
内容的提问来源于stack exchange,提问作者Arkadi
相关产品推荐
相关产品推荐

