У меня был проект, в котором мы использовали Unity, и я смотрел видео о StructureMap, и мне с самого начала понравилась идея регистрации.
Итак, я создал следующий интерфейс:
/// <summary>
/// An interface which must be implemented to create a configurator class for the UnityContainer.
/// </summary>
public interface IUnityContainerConfigurator
{
/// <summary>
/// This method will be called to actually configure the container.
/// </summary>
/// <param name="destination">The container to configure.</param>
void Configure(IUnityContainer destination);
}
И сборки предлагают класс Configurator по умолчанию. Мы также обернули наш Unity IoC, используя статический класс, чтобы мы могли вызывать IoC.Resolve<T>
, и я просто добавил следующие функции в эту оболочку:
/// <summary>
/// Configure the IoC
/// </summary>
public static class Configure
{
/// <summary>
/// Configure the IoC using by calling the supplied configurator.
/// </summary>
/// <typeparam name="TConfigurator">The configurator to use</typeparam>
public static void From<TConfigurator>() where TConfigurator : IUnityContainerConfigurator, new()
{
From(new TConfigurator());
}
/// <summary>
/// Configure the IoC using by calling the supplied configurator.
/// </summary>
/// <param name="configurationInterface">The configurator instance to use</param>
public static void From(IUnityContainerConfigurator configurationInterface)
{
configurationInterface.Configure(instance);
}
// other configuration.
}
Так что в форме инициализации, либо программу, либо веб-сайт, я бы просто назвал:
IoC.Configure.From<BLL.DefaultMapping>();
В BLL есть такой класс:
public class DefaultMapping:IUnityContainerConfigurator
{
public void Configure(IUnityContainer destination)
{
destionation.RegisterType<IRepository, SQLRepository>();
// and more..
}
}
Единственным недостатком является то, что все ваши слои связаны с выбранным контейнером IoC.
Обновление : После этого ответа я разместил в своем блоге статью, содержащую оболочку Unity .