我有以下 .Net 控制器(高度簡化)可以執行以下操作:
public class FooController{
private MassTransit.Mediator.IMediator mediator;
public FooController(MassTransit.Mediator.IMediator mediator)
{
this.mediator = mediator;
}
[HttpPost]
public async Task CreateFooJob(FooJobRequest myRequest){
var client = mediator.CreateRequestClient<GoCreateJobRequest>();
var response = await mediator.GetResponse<GoCreateJobResponse>(new GoCreateJobRequest(myRequest));
return;
}
public class GoCreateJobConsumer : IConsumer<GoCreateJobRequest>{
//some work...
await context.ResponseAsync<GoCreateJobResponse>(new GoCreateJobResponse());
}
}
我正在努力使用 Autofac 初始化 IMediator 物件。MassTransit 檔案似乎認為是這樣的:
builder.AddMediator(c =>
{
c.AddConsumer<GoCreateJobConsumer>();
});
應該作業,但它沒有 - 它沒有將 IMediator 連接到中介物件(這是有道理的,因為 Autofac 沒有為此注冊任何東西)。相反,我的 WebApiConfig 代碼如下所示(想法取自此檔案頁面的“配置”部分:
var builder = new ContainerBuilder();
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
build.Register(m => MassTransit.Bus.Factory.CreateMediator(cfg =>
{
cfg.Consumer<GoCreateJobConsumer>();
})
);
var container = builder.Build();
config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
這實際上作業得相當好 - 當我通過我的控制器除錯時,我能夠進入請求。但是,在回傳回應時它失敗并說“loopback://localhost/response => 訊息未被消耗”。
我覺得我已經搜索了互聯網和 SO 以獲得如何配置這個東西的答案,但我無法弄清楚。有什么我想念的嗎??我覺得我在中介配置中缺少與工廠或總線想法相關的東西。有沒有另一種方法我應該接近撰寫仍然給我一些 DI 但使這些配置的東西作業的控制器?謝謝
uj5u.com熱心網友回復:
根據可用的源代碼,builder.AddMediator(... 是一個有效的擴展并且應該可以作業。
簡化示例
//...
var builder = new ContainerBuilder();
//add controllers
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
//setup mass transit
builder.AddMassTransit(x => {
//...omitted for brevity
});
//configure mediator
builder.AddMediator(c => {
c.AddConsumer<GoCreateJobConsumer>();
});
var container = builder.Build();
config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
//...
uj5u.com熱心網友回復:
我想到了!@Nkosi 是正確的,builder.AddMediator應該使用該函式來初始化它。但是,語法有點偏離。查看鏈接的檔案,該AddMediator函式回傳一個修改后的構建器物件。我不是 100% 確定為什么會這樣,但是回傳 builder 物件并將其重新分配給自己解決了我的問題。我的代碼最終看起來像這樣:
var builder = new ContainerBuilder();
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
builder = builder.AddMediator(c => {
c.AddConsumer<GoCreateJobConsumer>();
});
謝謝恩科西!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/350335.html
