在单例后面提取IoC容器 - 做错了吗?

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,假货,等等

这是一条湿滑的路吗?我是否会遇到潜在的问题?

Jul*_*rch 4

我已经看到甚至 Ayende 在 Rhino Commons 代码中实现了这种模式,但我建议尽可能不要使用它。温莎城堡默认没有此代码是有原因的。StructureMap 确实如此,但杰里米·米勒 (Jeremy Miller) 已经放弃它了。理想情况下,您应该像对待任何全局变量一样怀疑容器本身。

但是,作为替代方案,您始终可以将容器配置为将 IDependencyResolver 解析为对容器的引用。这可能听起来很疯狂,但它明显更加灵活。只需记住一个经验法则:对象应该调用“new”或执行处理,但不能两者兼而有之。对于“调用新的”,替换为“解析引用”。