我有一个.net-app,它提供了一种使用插件扩展应用程序的机制。每个插件必须实现一个插件接口(interface),并且还必须提供一个接收一个参数(资源上下文)的构造函数。

在插件类的实例化过程中,我通过反射进行查找,如果所需的构造函数存在,并且是,则实例化该类(通过反射)。如果构造函数不存在,则会抛出一个异常,指出无法创建该插件,因为所需的构造函数不可用。

我的问题是,是否可以在插件接口(interface)中声明构造函数的签名,以便实现插件接口(interface)的每个人还必须为构造函数提供所需的签名。这将简化插件的创建。

我不认为存在这种可能性,因为我认为这样的功能并不是接口(interface)设计的主要目的,但是也许有人知道这样做的声明,例如:

public interface IPlugin {
    ctor(IResourceContext resourceContext);
    int AnotherPluginFunction();
}

我想补充一点,我不想将构造函数更改为无参数,然后通过属性设置资源上下文,因为这会使插件的创建更加复杂。编写插件的人员不是具有丰富编程经验的人员。插件用于计算将由应用程序可视化的统计数据。

感谢所有的答案。

我决定让它成为一个接口(interface),因为我不想强制插件编程者从抽象类继承,这样他(她)就失去了从自己的基类继承的可能性。此外,从抽象类派生并不能确保插件程序员确实提供了所需的构造函数。这样只会增加可能性(程序员仍然可以只添加一个包含所需参数但又具有其他参数的构造函数,这也很糟糕。请参见Ken Browning答案的注释)。

尽管我在帖子中提到我不想要这样的 Assets ,但我将Danny Varod的答案标记为“接受”,因为我认为这是最合适的解决方案。感谢所有回答。

最佳答案

插件的可扩展性是我的最爱。

我要做的是确保该插件实现接口(interface)或继承适当的“插件套接字”的基类。

在某些地方,基类更合适(如果插件是一种X),
在某些接口(interface)中更合适(如果该插件使用IX)。

我没有将上下文传递给构造,而是为此使用了一个属性和一个无参数的公共(public)构造函数。

这也使得使用反射更容易对插件进行反序列化。

关于c# - 接口(interface)可以定义C#构造函数的签名,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3010277/

10-17 02:07