我有一个电子邮件组件,我正在集成到我的应用程序中,寻找一些关于如何构建包装器的提示,以便我可以在需要时将其与另一个第三方组件交换。
我现在的做法是:
此组件的任何用法都将通过界面进行,如:
IPop3 pop3 = new AcmeIncePop3Wrapper(); pop3.connect();
并且AcmeIncePop3Wrapper内部将是:
public void connect()
{
AcmeIncePop3 pop = new AcmeIncePop3();
pop.connect();
}
这是一个好方法吗?
我可以通过使用ninject添加另一个抽象,所以我可以换掉实现,但实际上这似乎是我所需要的,因为我不希望每天都改变第三方程序集,只是不想制作事情如此紧密耦合。
答案 0 :(得分:2)
我认为你的实施很好。基本上你的界面说“这就是我想要处理电子邮件的方式”,第三方组件可能以不同的方式做事,但如果你根据你的界面构建你的包装类,你应该能够将任何第三方组件工作到该界面。
您唯一需要注意的是您正在新建具体课程。你可以考虑使用工厂或其他什么,如果你正在新的很多 - 如果不是它可能不是一个大问题。我只是想,如果你在整个地方创建新的AcmeIncePop3(),那么它仍然与那个具体的类紧密耦合。
答案 1 :(得分:1)
我会说你的实施很好,这正是我要做的事情。
答案 2 :(得分:1)
你说的是正确的。
简单地使用接口无法解决问题,因为如果它位于第三方程序集中,则无法将定义的接口添加到所需的类中。相反,做两件事之一:
创建一个全新的类 所有不同的共同方法 你知道和处理的组件 每个不同的组件都可以 存在(额外的逻辑可能是 需要在这里处理专业 差异)。
使用common创建一个接口 方法等,然后创建一个新的 继承自第3个的类 党派和实施 接口。为每个班级做这个 您需要使用的新程序集。
选项2的问题在于您无法扩展sealed class
,我希望第三方可以这样做。
我建议选项1。