1

autofac xml 構成を使用して、同じインターフェースの複数の実装を構成することは可能ですか?

私が達成しようとしているのは、複数のジョブを実行する Windows サービスです。SMSまたは電子メールでキューからメッセージを送信する2つのジョブがあります。すべてのジョブは異なるアセンブリです。どちらも IQueuedMessageProvider に依存しています。1 つのジョブには電子メールの実装が必要で、もう 1 つは SMS の実装が必要です。両方のジョブのコンストラクタは次のようになります (質問のために簡略化されています)。

 public SendSmsJob(IQueuedMessageProvider queuedMessageProvider)
    {
        _queuedMessageProvider= queuedMessageProvider;
    }
 public SendEmailJob(IQueuedMessageProvider queuedMessageProvider)
    {
        _queuedMessageProvider= queuedMessageProvider;
    }

app.config で、次のような実装を登録しました

<component type="MyApp.Plugin.Sms.Verizon.VerizonSmsService, MyApp.Plugin.Sms.Verizon" service="MyApp.Model.Messages.QueuedMessages.Providers.IQueuedMessageProvider, MyApp.Model" />
<component type="MyApp.Plugin.Email.Smtp.EmailService, MyApp.Plugin.Email" service="MyApp.Model.Messages.QueuedMessages.Providers.IQueuedMessageProvider, MyApp.Model" />

ジョブが IQueuedMessageProvider の適切な実装を確実に取得するにはどうすればよいですか? 名前とキーに関するこの種の問題の解決について読んだことがありますhttps://code.google.com/p/autofac/wiki/TypedNamedAndKeyedServices

別のオプションは、すべての実装を登録し、IQueuedMessageProvider を IEnumerable にして、コンストラクターで適切な実装を取ることです。しかし、私はそれ自体の構成でそれを解決することを好みます。それは可能ですか、これを解決するためのより良い提案はありますか?

4

1 に答える 1

1

この記事の執筆時点では、Autofac の XML 構成には、サービス (メッセージ プロバイダーなど) の名前/キーを指定する機能がありますが、別のサービスのコンストラクター (「ジョブ」クラス) で特定の型を指定することはできません。特定の名前に関連付けられます。

実質的に 3 つのオプションがあります。

オプション 1: インターフェースを再設計する

インターフェイス(または抽象/基本クラス)を持つポイントは、実装を交換可能に使用できることです。(参照: Liskov 置換原理 ) あなたの設計がそれを行うことができないようなものである場合 (それがどのように見えるか)、その設計を再調査することは良いことです。タスクごとに異なるインターフェースが必要になる場合があります。

提供された小さなスニペットを見ると、プロセッサの「ジョブ」クラスがタイプごとに適切にキーできるように、トランスポート ( ISmsProvider、 )のメソッドごとに異なるインターフェイスを用意することを考えるかもしれません。IEmailProvider

オプション 2: Autofac モジュールを使用する

異なる「既知の構成」(開発用と本番用など) がある場合は、構成ごとに異なる Autofac モジュールを作成できます。モジュールでは、XML 構成よりもはるかに柔軟にすることができ、必要な名前付きインスタンスによる派手な接続を行うことができます。

タイプの場合と同じように、XML 構成を使用してモジュールを登録できます。そのため、さまざまな要件に基づいて XML 構成タイプの登録を切り替えるのではなく、XML 構成を変更して別のモジュールを登録します。

オプション 3: 独自の XML 構成パーサーを実装する

Autofac 3.0 の時点で、構成メカニズムには、XML 構成を解析して登録する独自のメカニズムを作成する方法があります。このサイトのドキュメントはまだ完全には更新されておらず、「クックブック」やサンプルも存在しないため、ソースを詳しく調べる必要がありますが、技術的には可能です。これに飛び込む前に、おそらく最初の 2 つのオプションのいずれかを検討します。

于 2013-01-25T16:22:14.687 に答える