c# - .Net Core MVC 1.0 中的 DI

标签 c# asp.net-mvc dependency-injection

我在许多 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/

相关文章:

c# - 抽象单例背后的 IoC 容器——做错了吗?

javascript - 无法在 FireFox 中阻止操作链接单击事件

javascript - 将数据从 javaScript 传递到 MVC Controller View ajax

c# - EntityFramework 存储库从接口(interface)和抽象类 : how to use dependency inject on ASP. NET MVC 驱动

c# - 统一: Will get a StackOverflowException if I try to get a singleton that is registered in multiple mappings

c# - 是否应该将依赖项注入(inject)比需要的多很多 "levels"?

c# - 为什么 IEnumerable.Count() 重新评估查询?

c# - 如何使用 MapRoute 捕获所有区域

c# - 页面加载前 "A potentially dangerous Request.Form value was detected from the client"

asp.net-mvc - 我什么时候应该使用 HtmlHelper 扩展方法?