2016-08-22 206 views
2

我在许多MVC示例中看到如何在Startup类的ConfigurationServices方法中注册您的接口。当你的代码都写在MVC应用程序中时,这很好,但在“真实世界”中,情况并非如此。.net在.net核心MVC 1.0

我在形式

public class MyService : IMyService 
{ 
    private readonly IMyRepository _myRepository; 
    public MyService(IMyRepository myRepository) 
    { 
     _myRepository = myRepository; 
    } 
    ....... 

一个类库项目现在在我的控制器我有以下形式的构造:

public HomeController(IConfigurationRoot config, IMyServcie myService) 
{ 
    ...... 

的问题是,在MyService接口没有被注册与DI容器和我真的不想膨胀ConfigurationServices方法与services.AddScoped<interface,class>()我的其他层次的代码行负载。

我需要在我的其他图层(存储库和服务)中做什么来首先在这里注册它们(都是.NET Core类库项目),然后将这些容器连接到父容器中?

+2

你必须从某个地方注册。你谈论的膨胀将会在某处。 – Shyju

+0

是的,我知道,但我想注册我的存储库层容器中的存储库层中定义的接口。然后我想在服务层容器中注册在我的服务层中定义的接口,然后另外将存储库容器作为扩展附加到服务层容器,然后最终在MVC项目的配置服务中注册服务层容器。我知道如何使用Unity做到这一点,但在核心1.0和内置的Di容器中,我不知道如何做到这一点。 – bilpor

+0

'ConfigurationServices'是你的组合根,所以你注册你的服务。膨胀必须去某个地方。您可以在其他图层中创建扩展方法,并定位“ServiceCollection”,然后根据需要进行填充。他们在技术上不是首先在那里注册的。他们在组合根目录中注册时,您将扩展方法应用于'ServiceConlection' – Nkosi

回答

5

ConfigurationServices是你的作文根,所以这是你注册你的服务。膨胀必须去某个地方。您可以在其他图层中创建扩展方法,并按照需要填充IServiceCollection然后填充。他们在技术上不是首先在那里注册的。当您将扩展方法应用于IServiceColection

您的其他图层必须参考Microsoft.Extensions.DependencyInjection.Abstractions才能访问IServiceCollection接口。

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 
} 

UPDATE 根据评论,你可以很容易地调用services.AddMyRepositories()AddMyServies扩展方法,而不是主要的项目本身

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 
} 
+0

感谢@Nkosi的详细解答。如果可以的话,我还有一个问题。你在哪里注册'.AddMyRepositories();'是否有可能在服务层中注册此项目,而不是主项目本身? – bilpor

+0

是的,它是一种扩展方法,并且考虑到你的服务层将引用版本库接口,你可以简单地在AddMyServies扩展方法中调用'services.AddMyRepositories()' – Nkosi