Начало работы с сервисным автобусом Rhino - PullRequest
3 голосов
/ 08 сентября 2011

Я прочитал много примеров / руководств (включая Александрию Айенде на MSDN).

Но получение обновленных сборок само по себе оказалось препятствием. После получения правильной версии Castle.Windsor - он не может найти правильный раздел в файле app.config. Синтаксис как в Rhino Service Bus, так и в CastleBootstrapper также был изменен - ​​и теперь я совершенно сбит с толку. «Документация» о спящих носорогах действительно не помогает мне начать работу.

Может ли кто-нибудь помочь мне с рабочим образцом Rhino Service Bus с Castle Windsor v. 3.0 (бета) или 2.5.3, указать мне что-то уже в сети или просто дать мне пошаговые указатели на то, что я нужно встать и бежать?

1 Ответ

8 голосов
/ 14 октября 2011

после загрузки последних битов Rhino-ESB из github (https://github.com/hibernating-rhinos/rhino-esb) и их сборки) довольно просто начать работу.

У меня есть приложение asp.net MVC, которое связывается с бэкэндом через Rhino-ESB.

На стороне MVC asp.net:

На global.asax.cs:

private IWindsorContainer _container;

protected void Application_Start()
{
    _container = new WindsorContainer();
    new RhinoServiceBusConfiguration().UseCastleWindsor(_container).Configure();
    _container.Install(new YourCustomInstaller());
    //Don't forget to start the bus
    _container.Resolve<IStartableServiceBus>().Start();
    ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory(_container));
}

Обратите внимание, что YourCustomInstaller должен реализовывать IWindsorInstaller, и вызарегистрируйте свои контроллеры с контейнером в методе Install:

public void Install(Castle.Windsor.IWindsorContainer container, Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore store)
{
    container.Register(Component
       .For<HomeController>().LifeStyle.PerWebRequest.ImplementedBy<HomeController>());

Также обратите внимание, что WindsorControllerFactory внутренне делегирует создание контроллера контейнеру:

protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {
        if (controllerType == null)
            return null;
        return (IController)this.container.Resolve(controllerType);
    }

Последнее, но не менее важноеукажите конфигурацию в вашем файле web.config

<configSections>
    <section name="rhino.esb" type="Rhino.ServiceBus.Config.BusConfigurationSection, Rhino.ServiceBus"/>
  </configSections>
  <rhino.esb>
    <bus threadCount="1"
         numberOfRetries="5"
         endpoint="rhino.queues://localhost:31316/Client"
         queueIsolationLevel="ReadCommitted"
         name="Client"/>
    <messages>
      <add name="YourMessagesNamespace"endpoint="rhino.queues://localhost:31315/Backend"/>
    </messages>
  </rhino.esb>

В этой конфигурации предполагается, что бэкэнд запускает очередь в localhost: 31315, а клиент запускает свою очередь на localhost: 31316.

Ввнутренняя сторона: если мы запускаем его как консольное приложение,

static void Main(string[] args)
        {
            IWindsorContainer container;
            container = new WindsorContainer();
            new RhinoServiceBusConfiguration()
                .UseCastleWindsor(container)
                .Configure();
            var host = new RemoteAppDomainHost(typeof(YourBootstrapper));
            host.Start();

            Console.WriteLine("Starting to process messages");
            Console.ReadLine();

Обратите внимание, что класс YourBootstrapper реализует CastleBootstrapper

public class YourBootstrapper: Rhino.ServiceBus.Castle.CastleBootStrapper
    {
        protected override void ConfigureContainer()
        {
            Container.Register(Component.For<OneOfYourMessages>());
        }
    }

, в котором мы регистрируем потребителядля OneOfYourMessages

...