将依赖注入与 .NET Core 类库 (.NET Standard) 结合使用

Posted

技术标签:

【中文标题】将依赖注入与 .NET Core 类库 (.NET Standard) 结合使用【英文标题】:Using Dependency Injection with .NET Core Class Library (.NET Standard) 【发布时间】:2017-05-10 11:11:06 【问题描述】:

我已经浏览了链接:

https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/dependency-injection

并了解了如何使用 Web API 的依赖注入。

正如上面链接中提到的,我可以使用 Startup (Startup.cs) 类在 API 层内进行依赖注入。但是.NET Core 类库如何实现依赖注入。下面是我添加类库的屏幕截图。

而我的项目结构是

在项目“DataManagement.Repository”中,我编写了一个类“UserRepository”,在项目“DataManagement.Repository.Interfaces”中编写了一个接口“IUserRepository”。

在项目“DataManagement.Business”中我写了一个类“UserManager”

class UserManager
    
        private IUserManager _userManager;
        public UserManager(IUserManager userManager)
        
            _userManager = userManager;
        
    

如您所见,我正在尝试通过构造函数来实现依赖注入。

但我不确定需要进行哪些更改才能在 .NET Core 类库(.NET 标准)中启用依赖项注入。

【问题讨论】:

【参考方案1】:

你不必在你的类库中做任何事情。只有主应用程序有composition root(应用程序生命周期中您可以设置对象图的最早点)。

这发生在您的 ASP.NET Core 应用程序的 Startup.cs 中。您还可以在此处注册您的依赖项:

services.AddScoped<IUserManager,UserManager>();

就是这样。类库没有组合根。它们也不应该,因为你不能在没有应用程序的情况下使用它们,并且使用的 IoC 容器是应用程序而不是库的选择。

但是,您可以提供方便的方法来执行此注册,例如 ASP.NET Core 或某种模块系统中常见的 AddXxx 方法,例如 Autofac 或 Castle Windsor 等第 3 方 IoC 容器。

【讨论】:

正如你在回答中所说,如果我在Startup.csom asp.net 核心应用程序中添加这个依赖项,然后我添加它对.NetCore 类库的引用,我可以使用它吗? 是的,如果你一直使用依赖注入(并且从不实例化服务new)它将起作用 我在http://***.com/questions/41342064/using-ihostingenvironment-in-netcore-library 中问了一个关于这个主题的问题,如果可以的话请给我帮助。谢谢 .Api 项目是否必须引用 .Repository 项目才能访问 .Repository 接口的实现? @WillC:是的,因为您的组合根是 Web 应用程序。您可以使用扩展方法将其抽象一点(例如 ASP.NET Core 使用 .AddXyz 在 .AddXyz` 方法中进行注册。

以上是关于将依赖注入与 .NET Core 类库 (.NET Standard) 结合使用的主要内容,如果未能解决你的问题,请参考以下文章

.Net Core在类库中使用当前HttpContext

在 .NET Core 中使用 FluentValidation 和依赖注入

Dora.Interception,为.NET Core度身打造的AOP框架 [4]:与依赖注入框架的无缝集成

.NET Core 默认依赖注入与 Castle DynamicProxy

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

[ASP.NET Core 3框架揭秘] 依赖注入:一个Mini版的依赖注入框架