VisualStudioIDEと対話したいWorkflowFoundation4 ActivityDesignersがいくつかあります(それらがWF4であるという事実は、質問とは関係ありません)。
これらのデザイナーはアセンブリで定義されており、herpaderp.dllと呼びます。最終的に、このdllはサーバーに配信され、そのアクティビティやその他のコードはその後も永遠に幸せに機能します。
ただし、この時間の前に、herpaderp.dllで定義されたアクティビティを使用する人々により良い設計時のエクスペリエンスを提供するために、設計者が現在のソリューションを検討できるようにしたいと思います。「ソリューションに保存されているサンプルデータを使用して、このアクティビティ構成をテストしましょう。便利なコンボボックスで見つけたサンプルデータです。1つ選択してください」という方針に沿ったものです。
さて、これは非常に簡単です。ナイーブな実装は次のとおりです。
var dteo = Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(DTE));
var dte = dteo as DTE;
if(dte == null) return; // not in Visual Studio or other wierdness, bail
var samples = dte.GetSampleDatum(); // super awesome extension method
ねえ、それはうまくいきました!しかし、わずかな問題があります... herpaderp.dllは、次のアセンブリを参照する必要があります。
- Microsoft.VisualStudio.Shell.10.0.dll
- envdte.dll
これらのアセンブリはSDKの一部です。それらをパッケージ化してサーバーに配信する必要があることは、私にはまったく意味がありません。それは私の大腸に別の虫垂を追加するようなものです。
デザイナー内からVisualStudioと対話する機能を維持しながら、これらの依存関係を解除するにはどうすればよいですか?
私が見ているように、私には3つの可能な答えがありますが、どれも私が特に満足しているものではありません。
- IoCを使用して、実行時にアセンブリにバインドします。これにより、対話が実行されます。アセンブリは、herpaderpで定義された単純なインターフェイスの背後に隠れながら、SDKアセンブリを参照できます。残念ながら、それは設計時にのみ重要であり、サーバー上では役に立たない別の依存関係を追加します。
- アセンブリ修飾名を使用して実行時に依存関係をロードし、背後に隠し
dynamic
ます。これは私のタイプセーフな繁殖を怒らせます。それに、100%でもうまくいくかどうかはわかりません。 - ある種のサービスの場所を介して、実行時にVisualStudioパッケージと対話します。私のソリューションはVisualStudio拡張機能を提供するので、それを作成したり、他の人に使用させたりすることを心配する必要はありません。しかし、それと相互作用するために、私は情熱を持って軽蔑しているある種の不完全なServiceLocatorBSパターンのがらくたを使用する必要があります。サービスロケーター。フェー。さらに、ある種のクロスプロセス(または少なくとも同じプロセス内のクロスAppDomain)通信も必要になります。
オプション3が私の最善の策だと私は信じています。私が見逃している別の解決策はありますか?私は私の3つの答えのうちの1つを嫌うのは間違っていますか?