.NET Core 8.0三层架构依赖注入:WebApi如何无直接引用注册DataAccess服务?
解决方案:让Logic层负责注册DataAccess服务
核心思路是把DataAccess的服务注册逻辑封装在Logic层里,WebApi只需要调用Logic层提供的扩展方法,完全不用直接接触DataAccess。
步骤1:在Logic层添加服务注册扩展方法
因为Logic层本身依赖DataAccess,所以它可以直接引用DataAccess.dll,在这里统一注册DataAccess和Logic自己的服务:
using Microsoft.Extensions.DependencyInjection; using DataAccess; namespace Logic { public static class ServiceRegistrationExtensions { public static IServiceCollection AddBusinessServices(this IServiceCollection services) { // 注册DataAccess层的服务(比如仓储、数据上下文等) services.AddScoped<IProductRepository, ProductRepository>(); services.AddDbContext<AppDbContext>(options => options.UseSqlServer("YourConnectionString")); // 注册Logic层的业务服务 services.AddScoped<IProductService, ProductService>(); return services; } } }
步骤2:在WebApi的Program.cs中调用扩展方法
WebApi只需要引用Logic.dll,然后调用上面的扩展方法,就能自动完成所有服务的注册,完全不用关心DataAccess的存在:
using Logic; var builder = WebApplication.CreateBuilder(args); // 一句话搞定Logic和DataAccess的服务注册 builder.Services.AddBusinessServices(); // 常规WebApi配置 builder.Services.AddControllers(); var app = builder.Build(); app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();
项目引用配置
- WebApi项目:仅引用Logic项目(或Logic.dll)
- Logic项目:引用DataAccess项目(或DataAccess.dll)
- DataAccess项目:无上层项目引用
这种方式既遵循了依赖倒置原则,又保证了WebApi层的纯净性,完全隔离了数据访问层的细节。
内容的提问来源于stack exchange,提问作者Itay.B
相关产品推荐
相关产品推荐

