在第三方程序集周围创建一个包装器 - 换出并解耦

时间:2009-11-12 15:25:11

标签: c# oop loose-coupling

我有一个电子邮件组件,我正在集成到我的应用程序中,寻找一些关于如何构建包装器的提示,以便我可以在需要时将其与另一个第三方组件交换。

我现在的做法是:

  1. 构建一个接口将我需要的功能。
  2. 使用我在此类中的第三方组件创建一个实现该接口的类。
  3. 此组件的任何用法都将通过界面进行,如:

    IPop3 pop3 = new AcmeIncePop3Wrapper(); pop3.connect();

  4. 并且AcmeIncePop3Wrapper内部将是:

       public void connect()
       {
             AcmeIncePop3 pop = new AcmeIncePop3();
             pop.connect();
       }
    

    这是一个好方法吗?

    我可以通过使用ninject添加另一个抽象,所以我可以换掉实现,但实际上这似乎是我所需要的,因为我不希望每天都改变第三方程序集,只是不想制作事情如此紧密耦合。

3 个答案:

答案 0 :(得分:2)

我认为你的实施很好。基本上你的界面说“这就是我想要处理电子邮件的方式”,第三方组件可能以不同的方式做事,但如果你根据你的界面构建你的包装类,你应该能够将任何第三方组件工作到该界面。

您唯一需要注意的是您正在新建具体课程。你可以考虑使用工厂或其他什么,如果你正在新的很多 - 如果不是它可能不是一个大问题。我只是想,如果你在整个地方创建新的AcmeIncePop3(),那么它仍然与那个具体的类紧密耦合。

答案 1 :(得分:1)

我会说你的实施很好,这正是我要做的事情。

答案 2 :(得分:1)

你说的是正确的。

简单地使用接口无法解决问题,因为如果它位于第三方程序集中,则无法将定义的接口添加到所需的类中。相反,做两件事之一:

  1. 创建一个全新的类 所有不同的共同方法 你知道和处理的组件 每个不同的组件都可以 存在(额外的逻辑可能是 需要在这里处理专业 差异)。

  2. 使用common创建一个接口 方法等,然后创建一个新的 继承自第3个的类 党派和实施 接口。为每个班级做这个 您需要使用的新程序集。

  3. 选项2的问题在于您无法扩展sealed class,我希望第三方可以这样做。 我建议选项1。