Улучшите этот общий абстрактный класс - PullRequest
1 голос
/ 14 мая 2010

У меня есть следующий абстрактный дизайн класса, мне было интересно, кто-нибудь может предложить какие-либо улучшения с точки зрения более строгого соблюдения наших требований или упрощения реализации ControllerBase.

//Dependency Provider base
public abstract class ControllerBase<TContract, TType> where TType : TContract, class
{
    public static TContract Instance 
    {
        get { 
    return ComponentFactory.GetComponent<TContract, TType>(); 
            }
    }

 public TContract GetComponent<TContract, TType>() where TType : TContract, class
 {   
        component = (TType)Activator.CreateInstance(typeof(TType), true);
        RegisterComponentInstance<TContract>(component);
 }
}

//Contract
public interface IController
{
 void DoThing();
}

//Actual Class Logic
public class Controller: ControllerBase<IController,Controller>
{
 public void DoThing();

    //internal constructor
    internal Controller(){}

}


//Usage
public static void Main()
{
 Controller.Instance.DoThing();
}

Следующие факты всегда должны быть правдой,

  • TType должен всегда реализовывать TContract (применяется с использованием общего ограничения)

  • TContract должен быть интерфейсом (не могу найти способ применить его)

  • TType не должен иметь публичного конструктора, только внутренний, есть ли способ принудительно применить, используя ControllerBase?

  • TType должен быть конкретным классом (не включать New () в качестве общего ограничения, поскольку конструкторы должны быть помечены как внутренние)

1 Ответ

0 голосов
/ 16 мая 2010

Существует способ принудительно установить TType как конкретный класс и одновременно запретить успех конструктору. Я предполагаю, что можно попытаться создать экземпляр TType, который будет успешным, только если это конкретный тип, однако вы хотите избежать создания экземпляров. Я бы предложил попробовать сгенерировать исключение из конструктора. В базе вашего контроллера вы можете окружить экземпляр кодом обработки исключений. Это будет проходить через время компиляции, только если вы создадите конкретный тип, и оно пройдет через время выполнения, если вы сгенерируете исключение ... Это общая плохая практика (если возможно), и я думаю, вам нужен совершенно другой дизайн, чтобы достичь того, что вы ищете .

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