代码之家  ›  专栏  ›  技术社区  ›  Tony Basallo

静态类作为实例属性

  •  1
  • Tony Basallo  · 技术社区  · 14 年前

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

    public interface IHttpHelp
    {
       ItemsManager {get;set;}
    }
    
    public static class ItemsManager
    {
       //static methods
    }
    
    public class HttpHelper
    {
       public ItemsManager { get { return ItemsManager;} 
    }
    

    上面的代码不起作用,因为“itemsmanager像变量一样使用,但它是一个类型错误。”有没有这样使用类?

    为了深入了解我正在做的事情,我有几个静态助手类可以访问httpruntime和当前上下文。我目前直接使用它们,但我想将它们转移到一个将使用IOC的容器类中。我可以让它们成为实例类,然后忘记它,但我想知道是否有一种方法可以做到这一点。

    3 回复  |  直到 10 年前
        1
  •  11
  •   felickz    10 年前

    不能使用这样的静态类,因为根据定义,不能创建它的实例,所以不能从属性返回它。使之成为 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; } }
    }
    
        2
  •  0
  •   cdhowie    14 年前

    此语言不直接支持。您可以手动编写代理类,也可以使用类似 Duck Typing Project 在运行时发出代理类。

    两者的结果相同:您将拥有一个实现接口的类,并将所有调用代理到静态类的静态方法。不管你是想自己写这个还是使用鸭式打字库,都取决于你自己。

    编辑: 如果你有这个选择的话,托马斯用单件衣服的答案是可行的。

        3
  •  0
  •   Samuel Neff    14 年前

    静态类不能实现接口——这真的没有多大意义。接口提供所有实例都支持的标准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...
    ...