2

私はNServiceBusを初めて使用し、構造マップを使用してコントローラーにIBusを挿入するのに苦労しています。実際、少し調べてみたところ、global.asaxのApplication_Startイベントに以下のコードを挿入することで注入できることがわかりました-

protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);

        Configure.With()
                 .Log4Net()
                 .StructureMapBuilder()
                 .XmlSerializer()
                 .MsmqTransport()
                 .IsTransactional(false)
                 .PurgeOnStartup(false)
                 .UnicastBus()
                 .ImpersonateSender(false)
                 .CreateBus();
    }

私のコントローラーでは、プロパティまたはコンストラクターインジェクションとしてIBusを使用できます。

private IBus Bus { get; set; }
    private ITest Test { get; set; }

    public MyLinkController(IBus bus, ITest test)
    {
        Bus = bus;
        Test = test;
    }

これは正常に機能し、問題なくバスを注入します。しかし、私の問題は、global.asaxを制御できないことです。そのため、構成を別の場所に配置したいと思います。たとえば、以下のように構造マップレジストリに配置しようとしました。

For<IBus>().Use(
            () =>
                NServiceBus.Configure.With()
                                         .Log4Net()
                                         .StructureMapBuilder()
                                         .XmlSerializer()
                                         .IsTransactional(true)
                                         .PurgeOnStartup(false)
                                         .UnicastBus()
                                         .ImpersonateSender(false)
                                         .CreateBus()
                                         .Start()
                );

しかし、それは役に立ちません。構造マップは、それ自体の初期化の前に構成を知る必要があるようです。では、application_startイベントなしでそれを行う方法はありますか?

4

1 に答える 1

3

私は構造マップ自体を通してそれを行うことができました。これは、構造マップ レジストリを変更した方法です。

public ServiceBusRegistry()
    {
        ForSingletonOf<IBus>().Use(
            NServiceBus.Configure.With()
                       .Log4Net()
                       .DefaultBuilder()
                       .XmlSerializer()
                       .MsmqTransport()
                       .IsTransactional(false)
                       .PurgeOnStartup(false)
                       .UnicastBus()
                       .ImpersonateSender(false)
                       .CreateBus()
                       .Start()
            );
    }

これを構造マップのレジストリ クラスに配置した後、コントローラーに IBus を挿入できます。

public MyController(IRepository<Test, int> repository, IBus bus)
    {
        _repository = repository;
        _bus = bus;
    }

ここでは、StructureMapBuilder の代わりに DefaultBuilder を使用していることに注意してください。将来的にはさらに改善を試みるかもしれませんが、今のところ問題なく動作しています。

更新(プロジェクトの設計が変更された後):

これで、API プロジェクト (プロジェクトは ASP.NET Web API) にスタートアップ クラスができましたが、global.asax の Application_start は使用しません。このスタートアップ クラスにスタートアップ コードを配置できます。

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(WebApiPreStartup), "Start", Order = -999)] //make sure we are first

namespace ADP.DS.FrontOffice.Quoting.WebApi
{
    public static class WebApiPreStartup
    {
        public static void Start()
        {
            GlobalFilterConfig.Configure(GlobalConfiguration.Configuration);
            BusConfig.Init();
        }
    }
}

構成は別のクラスにあります。

public static void Init()
    {
        Configure.Serialization.SystemXml();
        Configure.ScaleOut(s => s.UseSingleBrokerQueue());
        var configUnicastBus = Configure.With()
            .StructureMapBuilder(ObjectFactory.Container)
            .UseTransport<NServiceBus.RabbitMQ>()
            .PurgeOnStartup(false)
            .UnicastBus();
        configUnicastBus.SendOnly();
    }
于 2013-01-15T11:02:57.853 に答える