Статический класс как свойство экземпляра - PullRequest
1 голос
/ 11 ноября 2010

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

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

public static class ItemsManager
{
   //static methods
}

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

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

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

Ответы [ 3 ]

11 голосов
/ 11 ноября 2010

Вы не можете использовать такой статический класс, потому что по определению вы не можете создать его экземпляр, поэтому вы не можете вернуть его из свойства. Сделайте это синглтон вместо:

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 голосов
/ 11 ноября 2010

Статические классы не могут реализовывать интерфейсы - это действительно не имеет особого смысла.Интерфейс предоставляет стандартный API, который поддерживаются всеми экземплярами, и вы можете менять экземпляры и получать полиморфный доступ к методам через стандартный интерфейс.Со статическим классом все ссылки на него все равно через класс.

Обычно в этой ситуации вы хотите, чтобы фабрика поддерживала DI класса экземпляра, который реализует ваш помощник.

0 голосов
/ 11 ноября 2010

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

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

РЕДАКТИРОВАТЬ: Томас ответ на использование синглтона будет путь, если у вас есть такая опция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...