2010-11-11 4 views
1

У меня есть класс на основе интерфейса, который я хочу иметь в качестве свойств несколько статических классов. Однако я не могу найти способ использовать статический класс как свойство экземпляра для класса на основе интерфейса.Статический класс как свойство экземпляра

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

public static class ItemsManager 
{ 
    //static methods 
} 

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

Приведенный выше код не будет работать из-за того, что «ItemsManager используется как переменная, но это ошибка типа». Есть ли способ использовать класс таким образом?

Для некоторого понимания того, что я делаю, у меня есть несколько статических вспомогательных классов, которые получают доступ к httpruntime и текущему контексту. В настоящее время я использую их напрямую, но хочу перейти в класс контейнера, который будет использоваться IoC. Я мог бы сделать их экземплярами классов и забыть об этом, но мне интересно, есть ли способ.

ответ

9

Вы не можете использовать такой статический класс, потому что по определению вы не можете создать его экземпляр, чтобы вы не могли вернуть его из свойства. Сделать стартовой 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 для одноточечного :) –

+0

Это то, что я боялся:/Это не так, я просто делают это экземпляр класса, это не имеет большого значения - просто предпочтение. –

0

Это не поддерживается данным языком. Вы можете либо написать класс прокси вручную, либо использовать библиотеку, такую ​​как Duck Typing Project, чтобы выпустить прокси-класс во время выполнения.

Оба будут иметь одинаковый результат: у вас будет класс, который реализует интерфейс, и проксирует все вызовы статическим методам статического класса. Независимо от того, хотите ли вы написать это самостоятельно или использовать библиотеку ввода ути, зависит от вас.

РЕДАКТИРОВАТЬ: Ответ Томаса на использование синглтона - это путь, если у вас есть этот вариант.

0

Статические классы не могут реализовывать интерфейсы - это на самом деле не имеет особого смысла. Интерфейс предоставляет стандартный 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... 
... 
Смежные вопросы