将依赖注入与 .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.cs
om 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 中使用 FluentValidation 和依赖注入
Dora.Interception,为.NET Core度身打造的AOP框架 [4]:与依赖注入框架的无缝集成
.NET Core 默认依赖注入与 Castle DynamicProxy