Chr*_*nal 10 c# singleton inversion-of-control
通常,我喜欢让应用程序完全不知道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>();
}
}
Run Code Online (Sandbox Code Playgroud)
的IDependencyResolver:
public interface IDependencyResolver
{
T Resolve<T>();
T[] ResolveAll<T>();
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已经取得了很大的成功,我曾经几次使用它(也许每一个项目一次,我真的不想一直使用它),因为我可以注入任何我想要的东西:城堡,Stub,假货,等等
这是一条湿滑的路吗?我是否会遇到潜在的问题?
我已经看到甚至 Ayende 在 Rhino Commons 代码中实现了这种模式,但我建议尽可能不要使用它。温莎城堡默认没有此代码是有原因的。StructureMap 确实如此,但杰里米·米勒 (Jeremy Miller) 已经放弃它了。理想情况下,您应该像对待任何全局变量一样怀疑容器本身。
但是,作为替代方案,您始终可以将容器配置为将 IDependencyResolver 解析为对容器的引用。这可能听起来很疯狂,但它明显更加灵活。只需记住一个经验法则:对象应该调用“new”或执行处理,但不能两者兼而有之。对于“调用新的”,替换为“解析引用”。