4

私のソリューションには一種のプラグイン アーキテクチャがあります。プラグインを配置する既知のフォルダーがあります。プラグインは、ホスト プロジェクトで共有されるインターフェイスを実装します。

最初に、プラグインをロードしAssembly.LoadFrom(fi.FullName).GetTypes() 、必要なタイプをインスタンス化します(IPlugin)Activator.CreateInstance(type);

したがって、ホスト (メイン アプリケーション) は、プラグイン アセンブリによって実装された適切なコードを実行できます。これはこれまでのところうまくいきます。

しかし最近、NLogを介してアプリケーションロギングを実装しようとし、ホストプロジェクトでNLogを構成しましたが、うまく機能しました。

問題は、プラグイン アセンブリで (既に構成されている) ロガーを使用したいということです。NLog を参照して使用するだけでLogManager.GetCurrentClassLogger();は、構成セットがないようです。プラグイン アセンブリのホスト プロジェクトで構成したファイルにログを記録しません。

NLogger インスタンス (ホスト プロジェクトで作成) をプラグイン タイプのプロパティに挿入しようと考えました。

これは可能ですか、それともそのようなことを達成するための好ましい方法はありますか? ありがとう

4

2 に答える 2

3

これは機能するはずです - NLog 構成は、ロードされたプラグイン アセンブリに対しても機能するはずです。この問題は、おそらくプラグインのロード方法に関連しています。おそらくそれらは別のドメインにあるため (どのように機能するかは覚えていません)、NLog はメイン アプリケーションのログ構成にアクセスできません。

その場合、プラグイン アセンブリに個別の nlog 構成ファイルを追加してみてください (構成ファイルの命名規則については、nlog のドキュメントを参照してください)。

プラグインが動的に読み込まれる場合、IOC コンテナーが役立つとは思いません。コンテナーはプラグインを認識しないため、プラグインの読み込みと構成の方法を変更する必要があります。また、nlog の構成に IOC を使用するのは良い考えではありません。

前のオプションが機能しない場合は、app.config のアセンブリ プローブ パスを変更して、プラグインが既定のドメインに読み込まれるようにしてみてください。NLog はこれらのプラグインに対して機能するはずです (少なくとも私にとっては機能します)。

<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <probing privatePath="Plugins" />
</assemblyBinding>

于 2011-12-02T10:05:28.983 に答える
1

Unity や Lightcore などの依存性注入コンテナーをご覧ください。

それらはある種の「コンポーネント登録ストア」です。

そこで、コンポーネントをインターフェイスに登録できます。次に、コンシューマーはインターフェースを要求するだけです。

インターフェイスとコンポーネントのマッピングは、構成ファイルまたはソース コードで行うことができます。

そのため、苦労せずにマッピングを変更できます。

たとえば、新しいインスタンスを作成していて、ctor パラメーターとして複合型を使用している場合、これらのコンポーネントが登録されている場合は自動検索を行い、それらを自動的に挿入できます。

あなたを助けることができるいくつかのキーワードは、「ServiceLocator」、「MicroKernel」、「Depency Injection」です。

コンポーネント:

于 2011-11-30T13:30:16.757 に答える