C# 鸡和蛋问题使用NServicebus实现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

背景

我正在尝试设置一个需要与NServicebus端点通信的WebAPI2

我需要实现IoC,这将使用Autofac完成

我拥有的

定义如下的控制器:

[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;
}