C# 鸡和蛋问题使用NServicebus实现Autofac
背景 我正在尝试设置一个需要与NServicebus端点通信的WebAPI2 我需要实现IoC,这将使用Autofac完成 我拥有的 定义如下的控制器:C# 鸡和蛋问题使用NServicebus实现Autofac,c#,.net,inversion-of-control,autofac,nservicebus,C#,.net,Inversion Of Control,Autofac,Nservicebus,背景 我正在尝试设置一个需要与NServicebus端点通信的WebAPI2 我需要实现IoC,这将使用Autofac完成 我拥有的 定义如下的控制器: [RoutePrefix("api")] public class Controller : ApiController { private IEndpointInstance EndpointInstance { get; set; } public public MyController(IEndpointInstance
[RoutePrefix("api")]
public class Controller : ApiController
{
private IEndpointInstance EndpointInstance { get; set; }
public public MyController(IEndpointInstance endpointInstance)
{
this.EndpointInstance = endpointInstance;
}
[HttpGet]
[Route("dostuff")]
public async Task DoStuff()
{
var command = new MyCommand
{
...
};
await this.EndpointInstance.SendLocal(command);
}
}
和全球.asax
应用程序启动
使用Autofac注册ServiceBus
专用异步任务注册表ServiceBusWithAutofac()
{
var builder=new ContainerBuilder();
var endpointConfiguration=await GetEndpointConfiguration(“My.Service”);
var endpointInstance=await Endpoint.Start(endpointConfiguration);
RegisterInstance(endpointInstance);
var container=builder.Build();
UseContainer(c=>c.ExistingLifetimeScope(容器));
RegisterAppController(Assembly.getExecutionGassembly());
}
GetEndpointConfiguration
私有静态异步任务GetEndpointConfiguration(字符串名称)
{
var endpointConfiguration=新的endpointConfiguration(名称);
//设置传输。
var routing=endpointConfiguration.UseTransport().routing();
//注册并发布到自己
routing.RegisterPublisher(typeof(EventHasFinished),名称);
endpointConfiguration.UseSerialization();
endpointConfiguration.UsePersistence();
endpointConfiguration.SendFailedMessageTo(“错误”);
endpointConfiguration.EnableInstallers();
返回端点配置;
}
结果
我在UseContainer
行中遇到以下错误:
无法设置密钥的值:
NServiceBus.AutofacBuilder+LifetimeScopeHolder。设置已更改
锁定以进行修改。将任何配置代码移到列表的前面
配置管道
我认为这是什么意思
我认为在创建端点配置时,需要为NServicebus进行所有Autofac注册。在这之后,上面的代码将处理生成器实例
但是
我无法执行上述操作,因为我需要向IoC注册endpointinstance
,因为我需要在控制器中注册该实例来发送消息。这还不存在,因为我首先需要endpointConfiguration
所以我有一个鸡和蛋的情况
问题
我是否正确理解该问题,以及如何解决该问题
确保IoC对控制器正常工作
例如:此.EndpointInstance
已通过IoC正确实例化。您可以使用lambda表达式注册它,该表达式将在容器第一次被要求解析IEndpointInstance
时执行
builder
.Register(x=>
{
var endpointConfiguration=GetEndpointConfiguration(“My.Service”).GetAwaiter().GetResult();
var endpointInstance=Endpoint.Start(endpointConfiguration).GetAwaiter().GetResult();
返回端点实例
})
.As()
.SingleInstance();
这会有帮助吗?:看起来很有希望,但我得到一个确保控制器有一个无参数公共构造函数
错误。这意味着IoC错误地将null返回为值。但是越来越近了。您是否可以再次检查在lambda表达式中放置一个断点,该断点将端点。Start
有效地返回null
?由于某种原因,委托函数没有被命中。我将研究完全分离逻辑,因此autofac和NServiceBus是独立设置的。然而,你的回答回答了我的问题,所以给你。这仍然很有趣。您是否已将GlobalConfiguration.DependencyResolver
设置为AutoFacWebAPI DependencyResolver
的实例,如中所示?
protected async void Application_Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register);
await RegisterNServiceBusWithAutofac();
}
private async Task RegisterNServiceBusWithAutofac()
{
var builder = new ContainerBuilder();
var endpointConfiguration = await GetEndpointConfiguration("My.Service");
var endpointInstance = await Endpoint.Start(endpointConfiguration);
builder.RegisterInstance(endpointInstance);
var container = builder.Build();
endpointConfiguration.UseContainer<AutofacBuilder>(c => c.ExistingLifetimeScope(container));
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
}
private static async Task<EndpointConfiguration> GetEndpointConfiguration(string name)
{
var endpointConfiguration = new EndpointConfiguration(name);
// Set transport.
var routing = endpointConfiguration.UseTransport<MsmqTransport>().Routing();
// Register publish to self
routing.RegisterPublisher(typeof(EventHasFinished), name);
endpointConfiguration.UseSerialization<JsonSerializer>();
endpointConfiguration.UsePersistence<InMemoryPersistence>();
endpointConfiguration.SendFailedMessagesTo("error");
endpointConfiguration.EnableInstallers();
return endpointConfiguration;
}