0

Я создал проект единства Microsoft (моя первая с помощью Dependency Injection) с моим домом контроллер работает отлично, как и ожидалось, зарегистрировав свой класс сообщений следующим образомКак зарегистрировать компоненты во время выполнения с единицей DI

private static IUnityContainer BuildUnityContainer() 
{ 
    var container = new UnityContainer(); 
    container.RegisterType<IMessageService, MessageService>(new HierarchicalLifetimeManager()); 
    RegisterTypes(container); 

    return container; 
} 

проблема заключается в том, что я намерен сделать этот проект родителем для нескольких модулей, которые будут плагинами, как я могу зарегистрировать подключение и манипуляции с базой данных? Как я могу подключить другие модули, не добавленные первоначально без перекомпиляции проекта?

Примечание: Я использую Code First.

Вся помощь будет оценена по достоинству.

+1

Unity поддерживает также конфигурацию XML - поэтому вы можете добавлять новые элементы без перекомпиляции ... Или ваш вопрос заключается в том, как создать систему плагинов для добавления новых элементов в контейнер при загрузке плагина? –

+0

Вам нужен дизайн приложения типа плагина, возможно, подумайте над [Boxes] (https://github.com/boxes-project). – forseta

ответ

1

Прежде всего вам необходимо зарегистрировать раздел конфигурации Unity. Это выглядит так:

<section name="unity" 
     type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration, Version=2.1.505.0, Culture=neutral, PublickKeyToken=31bf3856ad364e35" /> 

Это конфигурация Unity 2. Далее следует добавить единицу.

<unity xmlns="http://schemas.microsoft.com/practices/2010/unity"> 
    <!-- General aliases --> 
    <alias alias="string" type="System.String, mscorlib" /> 
    <alias alias="singleton" type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager, Microsoft.Practices.Unity, Version=2.1.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> 
    <!-- Interface aliases --> 
    <alias alias="ISampleService" type="MyApp.Api.Interfaces.Services.ISampleService, MyApp.Api" /> 
    <alias alias="IMessagingService" type="MyApp.Api.Interfaces.Services.IMessagingService, MyApp.Api" /> 

    <!-- Concrete implementations aliases --> 
    <alias alias="SampleServiceImpl" type="MyApp.BizLayer.SampleService, MyApp.BizLayer" /> 
    <alias alias="MessagingServiceImpl" type="MyApp.BizLayer.SampleService, MyApp.BizLayer" /> 

    <container> 
     <register type="SampleServiceImpl" mapTo="ISampleService"/> 
     <register type="MessagingServiceImpl" mapTo="IMessagingService"> 
      <lifetime type="singleton" /> 
     </register> 
    </container> 
</unity> 

В своем коде, в global.asax (или Unity Bootstrapper.cs если вы загрузили его через NuGet) вы бы использовать что-то вроде этого:

public static class UnityBootstrapper 
{ 
    public static void Initialise() 
    { 
     var container = BuildUnityContainer(); 

     DependencyResolver.SetResolver(new UnityDependencyResolver(container)); 

     var resolver = DependencyResolver.Current; 
     var newResolver = new Infrastructure.IoC.UnityDependencyResolver(container, resolver); 

     DependencyResolver.SetResolver(newResolver); 
    } 

    private static IUnityContainer BuildUnityContainer() 
    { 
     var container = new UnityContainer(); 
     var unityConfigSection = WebConfigurationManager.GetSection("unity") as UnityConfigurationSection; 

     if (unityConfigSection != null) 
     { 
      unityConfigSection.Configure(container); 
     } 

     return container; 
    } 
} 

Это все есть на него.

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