1

我已经实现了一个“插件”系统,我的应用程序在其中创建了在运行时实现接口以允许可插入功能的类。

我通过在插件程序集中实现指定接口的所有类上使用 Activator.CreateInstance 来实现这一点。

目前我只使用该类的一个实现,为此我有两个构造函数参数,并将它们包含在 Activator.CreateInstance 调用中:

 instanceList.Add((Foo)Activator.CreateInstance(_TypeList[typeKey], new object[] { arg1, arg2 }));

我意识到如果添加了不使用此构造函数签名的实现,这可能会在以后引起问题。处理这个问题的最佳情况是什么。

通过文档明确说构造函数需要使用此签名,然后将其包围在 try/catch 中?

或者有没有办法调用一个类的任何构造函数?请记住,我必须以某种方式匹配构造函数参数。

或者...通过将参数作为静态属性放在静态类中来避免构造函数参数?

4

2 回答 2

1

首先,我将重构代码以将构造抽象为工厂类。然后工厂使用的策略可以决定最佳方式(如果不同)以及在出现错误时该怎么做 - 例如缺少构造函数。您可以根据需要使用泛型使接口具有强类型或松散类型。

不过,我会坚持使用 Activator。我们在这种构造上做了很多工作,它给我们带来了很多东西,包括基于运行时发现的类型的后期绑定、单例、类型别名、自定义安全等。

于 2009-08-02T23:48:06.040 回答
1

我会要求所有插件都有一个不带参数的构造函数,并向接口添加一个初始化方法,并带有一些通用参数。

无法知道插件的所有可能实现都需要哪些参数。

于 2009-08-02T23:48:49.207 回答