是一个静态类的实例包装器,用于DI反模式的目的吗?

dea*_*vmc 5 c# dependency-injection anti-patterns

我已经构建了一个小的静态对象,用于将泛型类型保存到WP7上的独立存储.这适用于较旧的项目,但有些新项目使用DI来管理配置.我是DI的粉丝,因为这意味着我可以在一个地方更改配置并将其过滤到所有依赖项.

我的想法是创建一个名为Injection的命名空间,并将该对象包装在一个带有接口的实例中,以便我可以将其注入.它还使我能够为需要更具体实现的存储处理程序换出存储处理程序.

这是常见做法还是反模式?

作为一个注释,我想保持静态选项不是每个人都需要或可以使用DI.我只是尝试以最少的重复次数启用它们.

Mar*_*ann 8

你总是这样看.主要是处理已经静态或密封或未实现任何接口的遗留代码.虽然是基类而不是接口,但HttpContextBase是我能想到的最突出的例子.

由于您希望保留静态选项,这基本上就是您目前所处的情况,因此请继续执行.Injection但是,我不会创建命名空间,因为该名称更多地讲述了机制而不是对象所扮演的角色.

你不写究竟如何类是静态的,但我假设我们正在谈论与静态方法静态类.

稍微更优雅的解决方案(如果你可以稍微更改一下)是将静态类转换为Singleton.然后它可以是静态的并同时实现接口:

public class Foo : IFoo
{
    private readonly static Foo instance = new Foo();

    private Foo() { }

    public static Foo Instance
    {
        get { return Foo.instance; }
    }

    // IFoo member:
    public void InterfaceFoo()
    {
        Foo.LegacyFoo();
    }

    public static void LegacyFoo()
    {
        // Implementation goes here...
    }
}
Run Code Online (Sandbox Code Playgroud)

我认为实现这种解决方案所需的唯一重构是使类本身具体化,并使其作为Singleton实现接口.

旧客户端仍然可以通过调用来访问其方法 Foo.LegacyFoo();