Как правило, мне нравится, когда приложение полностью игнорирует контейнер 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, подделки и т.д.
Это скользкая дорога? Могу ли я столкнуться с потенциальными проблемами в будущем?