Как правило, мне нравится, когда приложение полностью игнорирует контейнер IoC. Однако я столкнулся с проблемами, когда мне нужно было получить к нему доступ. Чтобы абстрагироваться от боли, я использую базовый синглтон. Прежде чем бежать в горы или вытащить дробовик, позвольте мне перейти к моему решению. По сути, синглтон IoC абсолютно ничего не делает, он просто делегирует внутренний интерфейс, который должен быть передан. Я обнаружил, что это делает работу с Singleton менее болезненной.
Ниже показана оболочка IoC:
public static class IoC
{
private static IDependencyResolver inner;
public static void InitWith(IDependencyResolver container)
{
inner = container;
}
/// <exception cref="InvalidOperationException">Container has not been initialized. Please supply an instance if IWindsorContainer.</exception>
public static T Resolve<T>()
{
if ( inner == null)
throw new InvalidOperationException("Container has not been initialized. Please supply an instance if IWindsorContainer.");
return inner.Resolve<T>();
}
public static T[] ResolveAll<T>()
{
return inner.ResolveAll<T>();
}
}
IDependencyResolver:
public interface IDependencyResolver
{
T Resolve<T>();
T[] ResolveAll<T>();
}
До сих пор я пользовался большим успехом, когда использовал его несколько раз (возможно, один раз в несколько проектов, я действительно предпочел бы вообще не использовать его), поскольку я могу вводить все, что захочу: Castle, Stub , подделки и т. д.
Это скользкая дорога? Собираюсь ли я столкнуться с потенциальными проблемами в будущем?