如何使用包含在其类依赖注入中的 .net 5 类库的 dll?

Posted

技术标签:

【中文标题】如何使用包含在其类依赖注入中的 .net 5 类库的 dll?【英文标题】:How do I use dll of .net 5 class library that contain in its class Dependency injection? 【发布时间】:2021-11-28 09:48:57 【问题描述】:

在我的 Asp.net Core 5 API 项目中

我有一个控制器使用的 serviceLayer,用于从名为 dataLayer 的第三层获取数据。 我想将服务层用作不同项目中的 DLL。

这个ServiceLayer包含这样的依赖注入:

namespace ServiceLayer

    public class UserService :  IUserService
    
        IUserRepository userRepository; // (From DataLayer)
        public UserService(IUserRepository repository) : base(repository)
        
            this.userRepository = repository;
        
        public Users GetAllPersonsById(int id)
        
                return userRepository.GetById(id);
        
    

    public interface IUserService : IService<Users>
    
        Users GetAllPersonsById(int id);
    

如何在 DLL ServiceLayer

中使用 GetAllPersonsById 方法

【问题讨论】:

创建类库项目 ServiceLayer,是一个类库。我想在其他项目中使用它。我关于如何使用它的问题,因为依赖注入 然后作为引用导入,依赖注入在DLL本身完成 如果类库与应用在同一个解决方案中,只需将其添加为项目引用(右键单击引用然后添加引用)。如果没有,您将不得不创建一个 nuget 包。 【参考方案1】:

我可以使用它,因为依赖注入

一旦您引用了 DLL/项目,您就可以像在项目中一样使用所有类。

将类用作服务:

    提供服务 注入服务

有很多可用的文档,所以我会保持简短:

// provide in startup.cs
services.AddTransient<IUserService, UserService>();

// Inject where you need it
MyConstructor(IUserService userService) 

见https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-5.0

提供扩展方法

如果我们看看其他库,它们中的大多数都提供了设置服务的方法。

示例:实体框架核心

public void ConfigureServices(IServiceCollection services)
                    
    services.AddDbContext<MyDbContext>(options => options.UseSqlServer(...));

所以你可以:

    在您的库中,为 IServicesCollection 创建一个扩展方法,以添加您的库的所有服务。 在消费项目中,调用services.AddMyLibServices()

这可能看起来像这样:

public static class ServicesConfiguration

    public static void AddDataLayer(this IServiceCollection services)
    
        services.AddTransient<IUserService, UserService>();
        // ... same for all services of your lib
    

这里有一个更详细的教程: https://dotnetcoretutorials.com/2017/01/24/servicecollection-extension-pattern/

Lamar 服务注册表

一种可选的替代方法是服务注册。它与扩展方法非常相似,但使用一个类来进行设置。见https://jasperfx.github.io/lamar/documentation/ioc/registration/registry-dsl/

组合根

您可能想阅读有关组合根模式的信息,例如What is a composition root in the context of dependency injection?

在一个简单的应用程序中,您的 startup.cs 是您的组合根。在更复杂的应用中,您可以创建一个单独的项目,以便在一个地方配置您的应用服务。

创建 DLL

创建DLL有两种方式:

作为解决方案中的一个项目(因此您的解决方案有多个项目,每个项目都会产生一个单独的 DLL) 作为单独的解决方案和 nuget 包

【讨论】:

以上是关于如何使用包含在其类依赖注入中的 .net 5 类库的 dll?的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin - 如何在其类之外使用列表

NetCore 3.1 项目搭建反射依赖注入,Swagger结合Jwt,sqlSugar+EfCore异常中间件+Log4Net+MongoDb,Redis+Docker,丰富的公共类库,代码示例 下

如何在其构造函数中获取使用依赖注入的类的实例

.NET和Python哪个好?新应用诞生.NET依赖注入在区块链项目AElf中的实践问题

如何使用 asp.net 核心中的依赖注入在工作单元模式中延迟注入存储库

ASP.NET Core 依赖注入单个聚合类而不是多个单独的构造函数注入