我在许多 MVC 示例中看到如何在 ConfigurationServices
中注册您的接口(interface)Startup
的方法类(class)。当您的代码全部编写在 MVC 应用程序中时,这很好,但在“现实世界”中,情况不一定如此。
我有一个以下形式的类库项目
public class MyService : IMyService
{
private readonly IMyRepository _myRepository;
public MyService(IMyRepository myRepository)
{
_myRepository = myRepository;
}
.......
现在在我的 Controller 中我有一个以下形式的构造函数:
public HomeController(IConfigurationRoot config, IMyServcie myService)
{
......
问题是,MyService
接口(interface)尚未在 DI 容器中注册,我真的不想让 ConfigurationServices
变得臃肿。负载为 services.AddScoped<interface,class>()
的方法我的其他层的代码行。
我需要在其他层(存储库和服务)中做什么才能首先在此处注册它们(两者都是 .NET Core 类库项目),然后将这些容器连接到父容器?
最佳答案
ConfigurationServices
是您的组合根,因此您可以在其中注册服务。肿胀必须去某个地方。您可以在其他层和目标 IServiceCollection
中创建扩展方法,然后根据需要进行填充。从技术上讲,他们并不是首先在那里注册的。当您对 IServiceColection
您的其他层必须引用 Microsoft.Extensions.DependencyInjection.Abstractions
才能访问 IServiceCollection
接口(interface)。
IMO 我认为这些扩展方法不需要位于您的服务或存储库层中。这些层不需要知道它们是如何组成的。如果最终目标是使启动类更干净,您可以轻松地将它们放在另一个类的组合根中,并如上所示调用它们。或者放入一个单独的扩展项目,专门针对.net core的DI框架。
服务扩展层
public static IServiceCollection AddMyServices(this IServiceCollection services) {
services.AddScoped<IMyService, MyService>();
//...add other services
}
存储库扩展层
public static IServiceCollection AddMyRepositories(this IServiceCollection services) {
services.AddScoped<IMyRepository, MyRepository >();
//...add other services
}
然后在您的组合根目录中ConfigureServices
public void ConfigureServices(IServiceCollection services) {
//...other code
services
.AddMyServices()
.AddMyRepositories();
//...other code
}
更新
根据评论,您可以轻松地调用 AddMyServies
扩展方法中的 services.AddMyRepositories()
,而不是主项目本身
public static IServiceCollection AddMyServices(this IServiceCollection services) {
services.AddMyRepositories();
services.AddScoped<IMyService, MyService>();
//...add other services
}
然后在您的组合根目录中,ConfigureServices
只需要调用 AddMyServices
public void ConfigureServices(IServiceCollection services) {
//...other code
services.AddMyServices();
//...other code
}
关于c# - .Net Core MVC 1.0 中的 DI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39079368/