Как зарегистрировать компоненты во время выполнения с Unity DI

Я создал проект Microsoft unity (я впервые использовал внедрение зависимостей) с моим домашним контроллером, работающим нормально, как и ожидалось, зарегистрировав свой класс обмена сообщениями следующим образом

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

  return container;
}

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

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

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


person Peter    schedule 07.06.2013    source источник
comment
Unity также поддерживает конфигурацию XML - так что вы можете добавлять новые элементы без перекомпиляции ... Или ваш вопрос заключается в том, как разработать систему плагинов для добавления новых элементов в контейнер при загрузке плагина?   -  person Alexei Levenkov    schedule 08.06.2013
comment
Вам нужен дизайн приложения типа плагина, возможно, подумайте о чем-то вроде Boxes.   -  person forseta    schedule 08.06.2013


Ответы (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;
    }
}

Вот и все.

person Husein Roncevic    schedule 08.06.2013