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