但是,如果仅打算使用COM,这种设计是否会带来我看不到的好处?
你的问题的这个片段是在你的设计决策的最重要的部分在这里,答案是(一如既往),它依赖。
如果仅打算通过COM Interop使用该库,则应牢记这一点设计整个系统。没有理由使行数增加三倍。系统中的LoC越多,缺陷就会越多。因此,您应该将系统设计为仅使用COM兼容功能。
但是,我想不出将.Net库限制用于COM的充分理由。您为什么不希望能够在其他.Net代码中使用该程序集?这样限制自己毫无意义。
我对此有一些经验,因此我将分享我的处理方式。它当然不是理想的。我做了一些折衷。我只对与较新的.Net习惯用法不兼容的COM类(实际上是接口)使用外观,否则,我直接将.Net接口公开给COM。基本上,这意味着我会将外观用于任何使用泛型的接口。泛型是我遇到的唯一不兼容的东西。不幸的是,这意味着返回的任何事物的外观IEnumerable<T>
,这是很常见的。
但是,这并不像看起来那样糟糕,因为您的Facade类继承自.Net类并实现了特定的Interop接口。这样的东西。
namespace Company.Product.Feature
{
public class MyClass : INetInterface
{
// lots of code
}
}
namespace Company.Product.Interop
{
public class MyClass : Feature.MyClass, IComInterface
{
// over ride only the incompatible properties/methods
}
}
这样可以将重复的代码保持在最低限度,并保护您的COM接口免受“意外”更改。随着核心类/接口的更改,适配器类必须使用更多方法(或破坏接口并增加主版本号)。另一方面,并非所有的Interop代码都存储在Interop
名称空间中,这可能导致文件组织混乱。就像我说的,这是一个权衡。
对于完整的示例,您可以浏览我的仓库的SourceControl和Interop文件夹。ISourceControlProvider
并GitProvider
会引起特别的兴趣。