2016-08-22 4 views
2

Я вижу во многих примерах MVC, как регистрировать свои интерфейсы в методе ConfigurationServices класса Startup. Это нормально, когда у вас есть код, написанный в приложении MVC, но в «реальном мире» это не обязательно будет так.DI in .Net Core 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, но в Core 1.0 и встроенном контейнере Di я не знаю, как это сделать. – bilpor

+0

'ConfigurationServices' - ваш корневой каталог, так что вы регистрируете свои услуги. Раздуваться надо куда-то. Вы можете создать метод расширения в своих других слоях и цели «ServiceCollection», а затем заполнить по мере необходимости. Технически они официально не зарегистрированы. они регистрируются в корне композиции, когда вы применяете метод расширения для 'ServiceColection' – Nkosi

ответ

5

ConfigurationServices - ваш корневой состав, так что вы регистрируете свои услуги. Раздуваться надо куда-то. Вы можете создать метод расширения в своих других слоях и целям IServiceCollection, а затем заполнить по мере необходимости. Технически они официально не зарегистрированы. они регистрируются в корне композиции при применении метода расширения по сравнению с IServiceColection

Ваши другие слои должны будут ссылаться на Microsoft.Extensions.DependencyInjection.Abstractions, чтобы иметь доступ к интерфейсу IServiceCollection.

IMO Я не думаю, что эти методы расширения должны быть в вашем сервисе или слоях репозитория. Эти слои не должны знать ничего о том, как они состоят. Вы можете так же легко поместить их в свой корневой каталог в другом классе и вызвать их так, как показано выше, если конечная цель - сделать класс запуска более чистым. Или добавьте отдельный проект расширения, который специально предназначен для настройки каркаса DI ядра .net.

Service Extension Layer

public static IServiceCollection AddMyServices(this IServiceCollection services) { 
    services.AddScoped<IMyService, MyService>(); 
    //...add other services 
} 

Repository Расширение слоя

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

Да, это метод расширения и учитывая, что ваш уровень сервиса будет ссылаться на интерфейс репозитория, вы могли бы так же легко вызвать 'services.AddMyRepositories()' в методе расширения AddMyServies' – Nkosi

Смежные вопросы