4

关于这个问题的一点背景故事:

我正在为我的本地酒吧编写一个 POS 系统,我希望它能够启用插件。对于这个特殊问题,我将使用以下场景:

我有一个计算器类,顾名思义,它会执行所有涉及当前收据、增值税等产品的计算。我希望这个类可以通过插件(在不同的程序集中)进行扩展,以添加功能到使用我们使用的这些特殊硬币。计算器只需遍历收据上的所有产品(在其构造函数中传递)以计算总金额。收据类有一个包含所有产品对象的列表。内置产品类没有任何与硬币相关的成员,这些在插件程序集中的另一个产品类中。

这里的问题是,如何让我的主程序动态选择正确的类用于产品?

我正在考虑将所有插件加载到列表或字典中,然后简单地遍历它们以检查产品类的覆盖是否存在,然后使用它,但我仍然需要某种通用接口,这不是一个选项。我确切地知道如何在 PHP 中做到这一点,但是可以在运行/安装时用更新的源编辑/替换源。

在此先感谢,汤姆。

编辑:为了简化问题:是否可以让外部插件程序集使用新方法扩展内置程序集,而不必在现有应用程序中对方法的名称/委托/任何内容进行硬编码?

4

4 回答 4

7

从提供的问题中看不出有任何理由不使用通用界面。例子:

public interface IProduct {

      decimal Price {get;}
}

public class Product : IProduct 
{
     decimal price;
     public decimal Price {
          get {
              return price;
          }
     }
}

public class Product1 : IProduct 
{
     decimal price;
     public decimal Price {
          get {
              return price;
          }
     }
}
....

Calculator迭代收集IProducts并要求每个人的Price财产后,应用与地区相关的增值税 + 任何东西并构建最终价格。

于 2013-04-16T15:14:22.457 回答
2

MEF 或任何半体面的 DI 容器应该能够做到这一点。所以所有类都实现接口,然后你调用 RESOLVE,它从你的目录中返回一个可枚举的实例。

MEF 的完整文档在http://msdn.microsoft.com/en-us/library/dd460648.aspx

于 2013-04-16T15:14:41.730 回答
1

要么手动实现你需要的工厂模式,要么使用任何现有的和舒适的依赖注入/控制反转容器与通用接口,例如 IPluging。

例如使用这个 SO 答案作为基本列表

主要的 C# DI/IoC 框架如何比较?

于 2013-04-16T15:18:13.693 回答
0

基本上,您正在寻找工厂模式和适配器模式的组合。

将所有“接口不是选项”的对象包装到适配器中,并使用工厂实例化它们,这反过来又会实例化你奇怪的对象。

工厂设计模式 - http://msdn.microsoft.com/en-us/library/ee817667.aspx

适配器设计模式 - http://www.dofactory.com/Patterns/PatternAdapter.aspx

于 2013-04-16T15:12:45.437 回答