2016-08-22 272 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