静态类作为实例属性

问题描述:

我有一个基于接口的类,我想有几个静态类作为属性。但是,我似乎无法找到一种方法来使用静态类作为基于接口的类的实例属性。静态类作为实例属性

public interface IHttpHelp 
{ 
    ItemsManager {get;set;} 
} 

public static class ItemsManager 
{ 
    //static methods 
} 

public class HttpHelper 
{ 
    public ItemsManager { get { return ItemsManager;} 
} 

上述代码将不起作用,因为“ItemsManager被用作变量,但它是一个类型错误。”反正有这种方式来使用班级吗?

有关我正在做什么的一些见解 - 我有几个可以访问httpruntime和当前上下文的静态帮助器类。我目前直接使用它们,但想要移入将使用IoC的容器类。我可以让他们实例类并忘记它,但我想知道有一个办法。

你不能使用这样的静态类,因为根据定义你不能创建它的一个实例,所以你不能从属性中返回它。使它成为一个singleton代替:

public class ItemsManager 
{ 
    #region Singleton implementation 

    // Make constructor private to avoid instantiation from the outside 
    private ItemsManager() 
    { 
    } 

    // Create unique instance 
    private static readonly ItemsManager _instance = new ItemsManager(); 

    // Expose unique instance 
    public static ItemsManager Instance 
    { 
     get { return _instance; } 
    } 

    #endregion 

    // instance methods 
    // ... 
} 

public class HttpHelper 
{ 
    public ItemsManager ItemsManager { get { return ItemsManager.Instance; } } 
} 
+0

+1单例:) – 2010-11-11 14:23:40

+0

这是我担心的:/既然如此,我就只让它作为一个实例类,它不是一个大问题 - 只是一个偏好。 – 2010-11-11 14:25:12

这不直接支持该语言。您可以手动编写代理类或使用像Duck Typing Project这样的库在运行时发出代理类。

两者都会有相同的结果:您将有一个实现接口的类,并将所有对静态类的静态方法的调用进行代理。无论你想自己写这个还是使用鸭子打字库,都取决于你。

编辑:如果你有这个选择,托马斯使用单身人士的答案将是一条路。

静态类无法实现接口 - 它真的就没有太大的意义。一个接口提供了一个所有实例都支持的标准API,您可以通过标准接口交换实例并以多态方式访问这些方法。有了静态类,所有对它的引用都是通过类。

通常在这种情况下,您希望工厂支持实施助手的实例类的DI。

public interface IHttpHelper 
{ } 

public class RealHttpHelper 
{ ... } 

public class FakeHttpHelper 
{ ... } 

public static class HttpHelper 
{ 
    public static IHttpHelper Instance 
    { 
     get 
     { 
      return whatever ? new RealHttpHelper() : new FakeHttpHelper(); 
     } 
    } 
} 

... 
HttpHelper.Instance.Context... 
...