У меня есть следующий абстрактный дизайн класса, мне было интересно, кто-нибудь может предложить какие-либо улучшения с точки зрения более строгого соблюдения наших требований или упрощения реализации 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 () в качестве общего ограничения, поскольку конструкторы должны быть помечены как внутренние)