通常,我喜欢让应用程序完全不了解 IoC 容器。但是,我遇到了需要访问它的问题。为了消除痛苦,我使用了一个基本的 Singleton。在你跑上山或拔出猎枪之前,让我回顾一下我的解决方案。基本上,IoC 单例完全没有做任何事情,它只是委托给一个必须传入的内部接口。我发现这使得使用单例变得不那么痛苦。
下面是 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,一个存根,假货,等等
这是一条湿滑的路吗?我会在未来遇到潜在的问题吗?