Я создал проект Microsoft unity (я впервые использовал внедрение зависимостей) с моим домашним контроллером, работающим нормально, как и ожидалось, зарегистрировав свой класс обмена сообщениями следующим образом
private static IUnityContainer BuildUnityContainer()
{
var container = new UnityContainer();
container.RegisterType<IMessageService, MessageService>(new HierarchicalLifetimeManager());
RegisterTypes(container);
return container;
}
Проблема в том, что я собираюсь сделать этот проект родительским для нескольких модулей, которые будут плагинами. Как мне зарегистрировать подключение к базе данных и манипуляции с ней? Как подключить другие модули, не добавленные изначально, без перекомпиляции проекта?
Примечание. Я использую Code First.
Любая помощь будет оценена по достоинству.
Ответ 1 · рейтинг 1 · Husein Roncevic
Прежде всего вам необходимо зарегистрировать раздел конфигурации 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;
}
}
Вот и все.