2015-06-03 1 views
0

Я пытаюсь настроить свой NServiceBus для WebApi. Я пробовал этот: https://coderkarl.wordpress.com/2012/03/16/injecting-nservicebus-into-asp-net-webapi/NServiceBus и ApiController

Проблема в том, что синтаксис был изменен в новейшем NServiceBus-Versin. Я не могу использовать функции для Configure-Class, потому что они будут удалены в следующих версиях. Новый способ настройки шины - использовать BusConfiguration-Class, но я понятия не имею, как это сделать.

Вот старый код:

public static Configure ForWebApi(this Configure configure) 
{ 
    // Register our http controller activator with NSB 
    configure.Configurer.RegisterSingleton(typeof(IHttpControllerActivator), 
     new NSBHttpControllerActivator()); 

    // Find every http controller class so that we can register it 
    var controllers = Configure.TypesToScan 
     .Where(t => typeof(IHttpController).IsAssignableFrom(t)); 

    // Register each http controller class with the NServiceBus container 
    foreach (Type type in controllers) 
     configure.Configurer.ConfigureComponent(type, ComponentCallModelEnum.Singlecall); 

    // Set the WebApi dependency resolver to use our resolver 
    GlobalConfiguration.Configuration.ServiceResolver.SetResolver(new NServiceBusResolverAdapter(configure.Builder)); 

    // Required by the fluent configuration semantics 
    return configure; 
} 

И Application_Start():

AreaRegistration.RegisterAllAreas(); 

// Use LocalDB for Entity Framework by default 
Database.DefaultConnectionFactory = new SqlConnectionFactory("Data Source=(localdb)\v11.0; Integrated Security=True; MultipleActiveResultSets=True"); 

RegisterGlobalFilters(GlobalFilters.Filters); 
RegisterRoutes(RouteTable.Routes); 

BundleTable.Bundles.RegisterTemplateBundles(); 

Configure.WithWeb() 
    .DefaultBuilder() 
    .ForWebApi() // <------ here is the line that registers it 
    .Log4Net() 
    .XmlSerializer() 
    .MsmqTransport() 
     .IsTransactional(false) 
     .PurgeOnStartup(false) 
    .UnicastBus() 
     .ImpersonateSender(false) 
    .CreateBus() 
    .Start(); 

ли кто-то это удалось для NServiceBus версии 5?

ответ

1

Как говорится в wlabaj, documentation on the particular website говорит все. Почти.

Мы используем AutoFac так нам не нужно никаких прямых ссылок на IBUS или ISendOnlyBus, и для этого мы делаем это

ContainerBuilder builder = new ContainerBuilder(); 
var container = builder.Build(); 
configuration.UseContainer<AutofacBuilder>(x => x.ExistingLifetimeScope(container)); 

Что мы делаем в WebAPI и ASP.NET приложений это

NServiceBus.Bus.CreateSendOnly(configuration); 

Потому что это не хорошая практика ожидать, что ответные сообщения вернутся после отправки.

0

ForWebApi никогда не был частью NServiceBus, это был метод расширения из образца, который использовался для настройки преобразователя зависимости NServiceBus для создания экземпляров контроллеров. Способ, которым это было сделано, показан here.

Нет необходимости использовать преобразователь NServiceBus, поскольку это всего лишь оболочка вокруг другого контейнера. По умолчанию используется Autofac, поэтому вы можете просто использовать Autofac для работы во всем приложении.

Интеграция Autofac WebAPI правильно описана в документе documentation.

Документация NServiceBus содержит page об использовании собственного контейнера.

Это очень хорошо известная программа, которую вы можете легко реализовать.

1

Here вы можете увидеть синтаксис конфигурации 3.0 vs 4.0 vs 5.0. В верхней части страницы у вас есть ссылка для загрузки образцов кода.

Примеры для ASP.NET, поэтому вам нужно немного настроить его для WebAPI. Дайте мне знать, если вам нужна дополнительная помощь.