如何使用含依赖注入的.NET 5类库ServiceLayer DLL调用GetAllPersonsById方法
复用ServiceLayer DLL调用GetAllPersonsById方法的完整步骤
1. 打包生成DLL
- 右键你的ServiceLayer项目,选择【生成】,生成完成后在项目
bin/Release/net5.0(对应你设置的目标框架目录)下获取ServiceLayer.dll。 - 必须同步打包DataLayer项目获取
DataLayer.dll,ServiceLayer依赖DataLayer定义的IUserRepository接口与实现,两者需要同时引入目标项目。
2. 目标项目引入依赖
- 将
ServiceLayer.dll、DataLayer.dll复制到目标项目的本地目录。 - 右键目标项目的【依赖项】->【添加引用】->【浏览】,选中上述两个DLL完成添加。
- 确认目标项目已安装ServiceLayer、DataLayer依赖的所有NuGet包(如EF Core、数据库驱动等),版本需和打包时的版本一致。
3. 注册DI容器服务
你可以先在ServiceLayer项目中添加服务注册扩展方法,简化后续复用步骤,打包DLL前加入如下代码:
namespace ServiceLayer { public static class ServiceLayerExtensions { public static IServiceCollection AddServiceLayer(this IServiceCollection services) { // 注册所有服务层实例,后续新增服务也可在此统一添加 services.AddScoped<IUserService, UserService>(); return services; } } }
然后在目标项目的Startup.cs的ConfigureServices方法中注册所有相关服务:
public void ConfigureServices(IServiceCollection services) { // 先注册DataLayer的仓储实现,你也可以在DataLayer做类似的扩展方法统一注册 services.AddScoped<IUserRepository, UserRepository>(); // 注册ServiceLayer所有服务 services.AddServiceLayer(); // 其他服务注册逻辑... }
如果不想做扩展方法,也可以直接在目标项目手动注册IUserService和对应实现。
4. 调用GetAllPersonsById方法
方式1:构造函数注入(推荐,适用于控制器、其他DI托管的服务)
直接在需要调用的类的构造函数中注入IUserService即可调用:
[ApiController] [Route("api/[controller]")] public class UserController : ControllerBase { private readonly IUserService _userService; public UserController(IUserService userService) { _userService = userService; } [HttpGet("{id}")] public IActionResult GetUser(int id) { // 调用目标方法 var user = _userService.GetAllPersonsById(id); return Ok(user); } }
方式2:手动从容器获取(适用于非DI托管的场景)
如果需要在没有被DI托管的类中调用,可以手动从IServiceProvider获取实例:
// 示例:从HttpContext获取服务提供者,其他场景可替换为对应的ServiceProvider实例 using var scope = HttpContext.RequestServices.CreateScope(); var userService = scope.ServiceProvider.GetRequiredService<IUserService>(); var user = userService.GetAllPersonsById(id);
注意事项
- 目标项目的
appsettings.json需要配置和原项目一致的数据库连接字符串,保证DataLayer的仓储可以正常连接数据库。 - 如果有公共实体类、通用接口(如示例中的
IService<T>、Users实体),建议单独抽离到公共类库打包为DLL一起引用,避免两边定义不一致导致类型不匹配错误。 - 打包时选择Release模式生成DLL,性能更优体积更小。
内容的提问来源于stack exchange,提问作者Ali.K
相关产品推荐
相关产品推荐

