2014-12-16 4 views
1

Я просто пытаюсь добавить NServiceBus в веб-API, размещенный в OWIN. Моя цель состояла бы в том, чтобы сделать простой Bus.Send() внутри контроллера. Я нашел много сообщений в блогах, ответы StackOverflow и т. Д., Но до сих пор не повезло в выполнении этой простой задачи.NServiceBus, Web API и OWIN

Я работаю над проектом на основе этих 2 сообщений (я не начинал, но я подозреваю, что мой бывший коллега, взял его где-то в Интернете):

Injecting NServiceBus into ASP.NET MVC 3 и адаптация Web API: Injecting NServiceBus into ASP.NET WebApi

у меня есть распознаватель адаптер:

public class NServiceBusResolverAdapter : IDependencyResolver 
{ 
    private IBuilder builder; 

    public NServiceBusResolverAdapter(IBuilder builder) 
    { 
     this.builder = builder; 
    } 

    public object GetService(Type serviceType) 
    { 

     if (typeof(IHttpController).IsAssignableFrom(serviceType)) 
     { 
      return builder.Build(serviceType); 
     } 

     return null; 


    } 

    public IEnumerable<object> GetServices(Type serviceType) 
    { 
     if (typeof(IHttpController).IsAssignableFrom(serviceType)) 
     { 
      return builder.BuildAll(serviceType); 
     } 

     return null; 
    } 

    public IDependencyScope BeginScope() 
    { 
     return this; 
    } 

    public void Dispose() 
    { 

    } 
} 

, а также контроллер активатор:

public class NServiceBusControllerActivator : IHttpControllerActivator 
{ 
    public IHttpController Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType) 
    { 
     Console.WriteLine("NServiceBusControllerActivator Create"); 
     return DependencyResolver.Current.GetService(controllerType) as IHttpController; 
    } 

} 

Все завернутые в метод расширения, так что он может быть использовать для настройки NServiceBus:

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

     // 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, DependencyLifecycle.InstancePerCall); 
     } 

     // Set the WebApi dependency resolver to use our resolver 
     System.Web.Http.GlobalConfiguration.Configuration.DependencyResolver = 
     new NServiceBusResolverAdapter(configure.Builder); 

     return configure; 
    } 

} 

Так в основном, в классе запуска, NServiceBus получает конфигурируется с помощью расширения ForWebApi():

public class Startup 
{ 
    // This code configures Web API. The Startup class is specified as a type 
    // parameter in the WebApp.Start method. 
    public void Configuration(IAppBuilder appBuilder) 
    { 
     // Configure Web API for self-host. 
     HttpConfiguration config = new HttpConfiguration(); 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 

     // Inject NServicebus with Autofac 

     Configure.Serialization.Xml(); 
     Configure.Transactions.Disable(); 

     Configure.With() 
      .AutofacBuilder() 
      .ForWebApi() 
      .DefineEndpointName("MyServerWebApi") 
      .UseTransport<Msmq>() 
      .PurgeOnStartup(false) 
      .UnicastBus() 
      .ImpersonateSender(false) 
      .CreateBus() 
      .Start(); 


     appBuilder.UseWebApi(config); 
    } 
} 

Затем, основываясь на том, что написано в сообщениях блога от Дэвида Бойка и Карла Нильсона (см. Предыдущие ссылки), мне нечего было делать в контроллере, кроме как добавить свойство IBus, которое следует автоматически вводить ...

public class ValuesController : ApiController 
{ 

    // Add the Bus property to be injected 
    public IBus Bus { get; set; } 

    // GET api/values 
    public IEnumerable<string> Get() 
    { 
     return new string[] { String.Format("Welcome to ASP.NET MVC! Bus is '{0}'.", Bus.GetType().FullName) }; 
    } 
} 

Это «теория», потому что на практике свойство Bus всегда возвращает Null. Так есть кто-нибудь, кто мог бы помочь мне с этой простой задачей? Может быть, я все понял неправильно, и есть лучший способ с Autofac или другим контейнером DI? Не стесняйтесь предоставлять какие-либо данные, которые должны оказаться полезными. Но если у вас есть пример проекта на GitHub, было бы еще лучше!

Примечание: Версии я использую:

  • Owin: 2.0.2.0
  • System.Web.Mvc: 4.0.0.0
+0

мой подозреваемый в том, что, поскольку вы вызываете UseWebApi (config) в конце, во время вызова ForWebApi «System.Web.Http.GlobalConfiguration.Configuration» еще не является конфигурацией, которая будет использоваться при настройке owin , –

ответ

1

Я решил пойти с простой инжектор конструктора с Autofac. Поэтому я удалил весь активатор и адаптер. Добавлен модуль регистрации контейнера ioc, где я инициализирую и настраиваю все. На основании that sample

На данный момент это работает нормально.

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