NServiceBus 和 ApiController

NServiceBus and ApiController

我尝试为 WebApi 配置我的 NServiceBus。我试过这个:https://coderkarl.wordpress.com/2012/03/16/injecting-nservicebus-into-asp-net-webapi/

问题是语法已在最新的 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 Version 5 管理过吗?

ForWebApi 从来不是 NServiceBus 的一部分,这是来自示例的扩展方法,用于配置 NServiceBus 依赖项解析器以实例化控制器。显示的方式是 here.

不需要使用 NServiceBus 解析器,因为它只是另一个容器的包装器。默认情况下它使用 Autofac,因此您可以在整个应用程序中使用 Autofac 为您工作。

Autofac WebAPI 集成已在 documentation 中正确描述。

NServiceBus 文档有一个关于使用您自己的容器的page

这是一个众所周知的设置,您可以轻松实施。

Here 你可以看到 3.0 vs 4.0 vs 5.0 配置语法。在页面顶部,您有一个 link 用于下载代码示例。

尽管这些示例是针对 ASP .NET 的,因此您需要针对 WebAPI 稍微调整一下。如果您需要进一步的帮助,请告诉我。

正如 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);

因为期望回复消息在发送后返回不是一个好习惯。