2

Я столкнулся с проблемой курица и яйца с использованием NServiceBus 6, Autofac и приложения .NET для веб-приложений. Согласно документации NSB, NSB 6 does not automatically inject IMessageSession into a controller. Когда я делаю конфигурацию конечной точки в Startup.cs, мне нужно предоставить ей готовый контейнер, но тогда мне также нужно зарегистрировать созданную впоследствии конечную точку.NSeviceBus 6 - Как ввести IMessageSession с помощью Autofac в .Net Web API-контроллер?

Autofac жалуется, что использование Builder.Update() для модификации контейнера является устаревшим. Это работает, но я хотел получить некоторую обратную связь относительно лучшего способа сделать это, если это возможно.

 var httpConfig = new HttpConfiguration(); 

     var builder = new ContainerBuilder(); 
     builder.RegisterAssemblyModules(Assembly.GetExecutingAssembly()); 
     builder.RegisterApiControllers(Assembly.GetExecutingAssembly()).PropertiesAutowired(); 

     var container = builder.Build(); 
     httpConfig.DependencyResolver = new AutofacWebApiDependencyResolver(container); 

     var config = new EndpointConfiguration("...."); 
     config.SendFailedMessagesTo("Error"); 
     //...... 
     config.SendOnly(); 
     config.UseContainer<AutofacBuilder>(customizations => 
       { 
        customizations.ExistingLifetimeScope(container); 
       }); 

     var endpointInstance = Endpoint.Start(config).GetAwaiter().GetResult(); 

     // This is now needed to get IMessageSession injected into the controller 
     var builder = new ContainerBuilder(); 
     builder.RegisterInstance(endpointInstance).As<IMessageSession>(); 

     // Autofac says Update is OBSOLETE and not to modify the 
     // container after it is built! 
     builder.Update(container); 
+0

Зачем вам нужно вводить IMessageSession в первую очередь? Если вы объясните, чего вы хотите достичь, мы можем предложить альтернативу, поэтому вам не нужно обновлять контейнер после его создания. –

+0

Это не похоже, что этот код - это то, что вы используете, поскольку у вас есть две переменные с именем «config» в той же области. –

+0

@HadiEskandari Мне нужно иметь возможность отправлять сообщения с моих веб-контроллеров api. В NSB 5 я добавил бы свойство IBus, которое будет автоматически настроено для ввода NSB и используется Bus.Send(). –

ответ

1

Вы можете использовать регистрацию лямбда в своих интересах здесь.

Прежде всего, предположим, что у вас есть статический метод, который создает вашу конечную точку. Это облегчит отображение примера, если это так. Было бы выглядеть следующим образом:

public static IMessageSession CreateMessageSession(ILifetimeScope container) 
{ 
    var config = new EndpointConfiguration("...."); 
    config.SendFailedMessagesTo("Error"); 
    //...... 
    config.SendOnly(); 
    config.UseContainer<AutofacBuilder>(customizations => 
      { 
       customizations.ExistingLifetimeScope(container); 
      }); 

    return Endpoint.Start(config).GetAwaiter().GetResult(); 
} 

Примечание Я переключил использовать ILifetimeScope вместо контейнера.

Теперь вы можете сделать это:

builder.Register(ctx => CreateMessageSession(ctx.Resolve<ILifetimeScope>())) 
     .As<IMessageSession>() 
     .SingleInstance(); 

Используя SingleInstance срок службы области действия разрешены в лямбда будет эффективно корневой контейнер. Вещи выстроятся по мере необходимости.

Я признаю, что вам может понадобиться/нужен то, что EndpointConfiguration объект в другом месте. Вы все еще можете использовать lambdas, но регистрируете закрытие объекта. Измените статический метод, чтобы взять в конфигурации конечных точек, а также и ...

var endpointConfig = new EndpointConfiguration("...."); 
builder.Register(ctx => CreateMessageSession(endpointConfig, ctx.Resolve<ILifetimeScope>())) 
     .As<IMessageSession>() 
     .SingleInstance(); 
// Do further work with endpointConfig - lambda won't get called 
// until you actually resolve IMessageSession so the closure is 
// like a lazy bind. 

Даже если ваши требования являются более сложными, я думаю, лямбда и закрытие над объектами, как это собираются быть вашим путем вокруг попытки обновить построенный контейнер.

 Смежные вопросы

  • Нет связанных вопросов^_^