2

クラスファイルに IBus を挿入できるように、2 つを一緒にする方法について考えている人はいますか?

公式の Nservicebus.Ninject パッケージをダウンロードしようとしましたが、Nuget 経由で Ninject の 2.x ラインに制限されているようです。先に進み、ソースを Ninject のオブジェクト ビルダーにダウンロードしました。いくつかの試行錯誤のシナリオを経て、いくつかの問題が発生しています。

1 つ目は、IBus がプロパティ インジェクションによって設定されていないことです。これは、Objectbuilder がどのように利用されているかについての私の誤解かもしれませんが、public IBus Bus {get; set;} アセンブリ内のクラスで、それが設定されます。

次に、次のような方法で何かを試すルートをたどりました。

Configure.Instance.Builder.Build<IBus>()

これにより、次の結果が得られました。

Error activating IBus
More than one matching bindings are available.
Activation path:
1) Request for IBus

Suggestions:
1) Ensure that you have defined a binding for IBus only once.

IBus の代わりに UnicastBus を明示的に要求すると、インスタンスが 1 つ得られますが、次のように base.Activite で爆発します。

More than one matching bindings are available.
Activation path:
  2) Injection of dependency IBus into property Bus of type TimeoutMessageConverter
  1) Request for TimeoutMessageConverter

Suggestions:
  1) Ensure that you have defined a binding for IBus only once.

このプロジェクトは、Ninject を使用する既存のインフラストラクチャを活用し、バスへの参照を取得してディスパッチャーからパブリッシュを呼び出すことができるかどうかを確認するために渡されたため、ninject マスターであるとは主張しません (背景は spring.net です)。プロジェクト。一日の大部分はこれで私の車輪を回転させています。

Ninject によって読み込まれる NServiceBus モジュールを次に示します (別の SO 投稿から取得したセットアップ)。

public class NServiceBusModule : NinjectModule
{
    public override void Load()
    {
       this.Bind<IBus>().ToConstant(this.CreateBus()).InSingletonScope();
    }

    private IBus CreateBus()
    {
        return Configure.With()
                .DefineEndpointName("publishMe")
                .NinjectBuilder(this.Kernel)
                .XmlSerializer()
                .MsmqTransport()
                .IsTransactional(true)
                .InMemorySubscriptionStorage()
                .UnicastBus()                    
                .CreateBus().Start(() =>
                Configure.Instance.ForInstallationOn<NServiceBus.Installation.Environments.Windows>().Install());
    }


}

バスへの参照を取得するために必要なのはこれだけだと思ったので、EndpointConfig で IWantCustomInitialization を利用していません。

プロジェクトを少し分離し続けて、問題なく動作すると思われる別のアイデアがあります (web アプリ (global.ascx でバスを設定する) をエンドポイントに直接公開し、そこから移動します)。 )、しかし、プロジェクトの概要の最初の要件内にとどまろうとしています。

必要に応じて、より多くの情報を提供できます。

4

1 に答える 1

0

NinjectBuilderIBusバインディングを追加します。次の 2 つのオプションがあります。

  1. コードで再バインドを使用する
  2. CreateBus()バインディングを追加せずに呼び出すだけ
于 2012-04-14T22:39:15.933 に答える