我有一个.net-app,它提供了一个用插件扩展应用程序的机制.每个插件必须实现一个插件接口,并且还必须提供一个接收一个参数(资源上下文)的构造函数.
在插件类的实例化期间,我通过反射查看,如果需要的构造函数存在,如果是,我实例化类(通过Reflection).如果构造函数不存在,我抛出一个异常,说明不能创建插件,因为所需的构造函数不可用.
我的问题是,如果有一种方法可以在插件接口中声明构造函数的签名,那么实现插件接口的每个人都必须提供具有所需签名的构造函数.这样可以简化插件的创建.
我不认为存在这种可能性,因为我认为这样的功能不属于设计接口的主要目的,但也许有人知道这样做的声明,例如:
public interface IPlugin {
ctor(IResourceContext resourceContext);
int AnotherPluginFunction();
}
Run Code Online (Sandbox Code Playgroud)
我想补充一点,我不想将构造函数更改为无参数,然后通过属性设置资源上下文,因为这会使插件的创建变得更加复杂.编写插件的人不是具有深度编程经验的人.插件用于计算应用程序可视化的统计数据.
感谢所有的答案.
我已经决定,我让它成为一个接口,因为我不想强迫插件程序员从一个抽象类继承,以便他或她失去从一个自己的基类继承的可能性.此外,从抽象类派生并不能确保插件程序员真正提供所需的构造函数.它使它更有可能(程序员仍然有可能只添加一个包含所需参数的构造函数,但也有其他参数,这也很糟糕.请参阅Ken Browning答案的评论).
虽然我在帖子中提到我不想要这样的属性,但我将Danny Varod的答案标记为已被接受,因为我认为在我的情况下这是最合适的解决方案.感谢所有回答的人.
插件可扩展性是我的最爱......
我所做的是确保插件实现接口或继承相应"插件套接字"的基类.
在某些地方,基类更合适(如果插件是一种X),
在某些接口中更合适(如果插件执行IX).
我没有将上下文传递给构造,而是使用了一个属性和一个无参数的公共构造函数.
这也使得使用反射更容易反序列化插件.
| 归档时间: |
|
| 查看次数: |
6013 次 |
| 最近记录: |