0

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つの可能な答えがありますが、どれも私が特に満足しているものではありません。

  1. IoCを使用して、実行時にアセンブリにバインドします。これにより、対話が実行されます。アセンブリは、herpaderpで定義された単純なインターフェイスの背後に隠れながら、SDKアセンブリを参照できます。残念ながら、それは設計時にのみ重要であり、サーバー上では役に立たない別の依存関係を追加します。
  2. アセンブリ修飾名を使用して実行時に依存関係をロードし、背後に隠しdynamicます。これは私のタイプセーフな繁殖を怒らせます。それに、100%でもうまくいくかどうかはわかりません。
  3. ある種のサービスの場所を介して、実行時にVisualStudioパッケージと対話します。私のソリューションはVisualStudio拡張機能を提供するので、それを作成したり、他の人に使用させたりすることを心配する必要はありません。しかし、それと相互作用するために、私は情熱を持って軽蔑しているある種の不完全なServiceLocatorBSパターンのがらくたを使用する必要があります。サービスロケーター。フェー。さらに、ある種のクロスプロセス(または少なくとも同じプロセス内のクロスAppDomain)通信も必要になります。

オプション3が私の最善の策だと私は信じています。私が見逃している別の解決策はありますか?私は私の3つの答えのうちの1つを嫌うのは間違っていますか?

4

1 に答える 1

0

私が行った選択は、WCFを使用して、前後に通信するパイプという名前のプロセススコープ(命名規則を介して)を作成することです。

これはかなりうまくいきます。アクティビティアセンブリの内部でサービスとクライアント側を定義し、パッケージ側でサービスを実装できます。唯一の注意点は、デフォルトでは、サービスの実装はUIスレッドで呼び出しを処理するため、デザインサーフェス/クライアント側から呼び出しを行うときにUIスレッドをブロックできないことです。少し賢明な拡張メソッドのウィザードリィを使用すると、わずかな労力でクライアント呼び出しをThreadPoolにオフロードし、現在のSynchronizationContextを介して結果と例外をマーシャリングできます。

あまり手間をかけずに実装できました。残念ながら、私は最近、本当の問題は、デザイナーインストーラーを介してのみ配信される別のアセンブリでデザイナーを配信することであることに気付きました。その後、アクティビティは本番サーバーに配信されるため、依存関係の心配がなくなります。これには、私が手がかりがなかった慣習とプロセスに関する内部知識が必要です。このMSDNブログ投稿では、この質問をする前に知っておくべきことについて詳しく説明しています。

于 2011-05-18T18:01:23.307 に答える