ただし、COMのみを使用する場合、この種の設計は私には見られない利点をもたらしますか?
あなたの質問のこのスニペットは、ここにあなたの設計上の決定の最も重要な部分と、答えは(いつものように)で、それが依存します。
COM Interop経由でのみライブラリを使用する場合は、これを考慮してシステム全体を設計する必要があります。行数を3倍にする理由はありません。システムのLoCが多ければ多いほど、システムの欠陥も多くなります。したがって、COM互換機能のみを使用するようにシステムを設計する必要があります。
ただし、.Netライブラリの使用をCOMに制限する正当な理由は考えられません。他の.Netコードでアセンブリを使用したくないのはなぜですか?この方法で自分を制限することはほとんど意味がありません。
私はこれについてある程度の経験があるので、それをどのように処理したかを共有します。その確かに理想的ではありません。私はいくつかのトレードオフをしました。私は、新しい.Netイディオムと互換性のないCOMクラス(実際にはインターフェイス)のファサードのみを使用しています。それ以外の場合は、.Netインターフェイスを直接COMに公開します。これは基本的に、ジェネリックを使用するすべてのインターフェースにファサードを使用することを意味します。ジェネリックスは私が遭遇した唯一の互換性のないものです。残念ながら、これはを返すすべてのファサードを意味しますがIEnumerable<T>
、これはかなり一般的です。
ただし、ファサードクラスは.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
特に対象としています。