2

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

我现在的做法是:

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

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

在 AcmeIncePop3Wrapper 内部将是:

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

这是一个好方法吗?

我可能可以通过使用 ninject 添加另一个抽象,这样我就可以换出实现,但实际上这似乎就是我所需要的,因为我不希望每天都更改 3rd 方程序集,只是不想让事情变得如此紧密耦合。

4

3 回答 3

2

我认为你有一个很好的实现。基本上你的界面说“这就是我想要处理电子邮件的方式”,第三方组件可能会做不同的事情,但是如果你基于你的界面构建你的包装类,你应该能够在该界面中使用任何第三方组件。

您可能需要注意的唯一一件事是在哪里更新具体类。如果你经常更新它,你可以考虑使用工厂或其他东西 - 如果不是,它可能没什么大不了的。我只是在想,如果您在整个地方创建 new AcmeIncePop3() ,那么它仍然与该具体类紧密耦合。

于 2009-11-12T16:03:53.120 回答
1

你在正确的路线上。

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

  1. 使用您所知道的所有不同程序集共有的方法创建一个全新的类,并处理可能存在的每个不同程序集(此处可能需要额外的逻辑来处理主要差异)。

  2. 创建一个具有常用方法等的接口,然后创建一个继承自第 3 方类并实现该接口的新类。对您需要使用的新程序集中的每个类执行此操作。

选项 2 的问题是您不能扩展 a sealed class,我希望第三方可以这样做。我推荐选项1。

于 2009-11-12T15:34:16.707 回答
1

我会说你的实现很好,这正是我为了包装一些东西而要做的事情。

于 2009-11-12T15:30:07.603 回答