我有以下抽象类设计,我想知道是否有人可以在强化执行我们的要求或简化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()作为通用约束,因为构造函数应标记为Internal)
答案 0 :(得分:0)
有一种方法可以强制TType作为具体类并同时禁止构造函数成功。我想可能尝试实例化TType,只有当它是具体类型时才会成功,但是,你想要避免实例化。我建议尝试从构造函数中抛出异常。在您的控制器基础中,您可以使用异常处理代码包围实例化。只有当你实例化具体类型时才会通过编译时间,如果你抛出异常它将通过运行时...这是整体不好的做法(如果可能的话),我想你需要完全不同的设计来实现你在寻找什么