我正在构建一个协议处理程序。协议可能支持一组未知的请求类型,我将使用单个类来实现每种请求类型。这些请求处理程序类将扩展基处理程序类。我试图构建这样的系统,为了支持一个新的请求类型,我所需要做的就是为它添加一个类,并重新编译/部署/重启服务。
所以我有这样的东西:
foreach (Type classType in protocolAssembly.GetTypes())
{
if (classType.BaseType == typeof(ProtocolRequestHandler))
{
if (supportedRequestsMap.Contains(classType.Method))
{
// error: that method is already implemented!
}
supportedRequestsMap.Add(classType.Method, typeof(classType));
}
}
当服务重新启动时,添加一个新类,只要它处理的请求方法被声明。
我如何在编译时通过通过基类ProtocolRequestHandler属性方法将被实现?我不想使用方法类型为"Null"或"Unknown",或者抛出异常,并且我不想在扩展类的名称中固有地指定支持的协议请求类型(我想调用我喜欢的任何类)。
是否有某种方法可以强制在继承类中设置属性的值?
有没有更干净的方法来做这种动态加载?我应该使用属性来确定继承类所支持的方法吗?
你应该依赖接口作为你的插件应该实现什么方法的契约。
在这里可以找到一个很好的教程(有点老,但仍然非常相关)
如果您正在使用基类,为什么不直接将所需的方法创建为抽象方法(或者如果可能的话,指定一个虚拟的和默认的实现)。这将确保该方法存在于继承的类中。我相信你可能已经知道这一点,如果你进入反射和编写自己的协议处理程序,但我不确定是否有更好的方法来得到你想要的。