TL; DR;某些属性应该在应该注入服务时。 Nservicebus如何处理结构图上的嵌套容器?
嘿,伙计们新来的。我目前正在将我们的项目升级到NSB6。我对使用Structuremap的依赖注入有几个问题。我们有一些用于使用ISendOnlyBus的服务,我们从处理程序内部调用它。出于测试目的(我只想让处理程序工作)我将它们更改为IMessageHandlerContext,并在处理程序的开头我将上下文注入容器。它按预期工作,IMessageHandlerContext在这些服务上解析,我可以使用它。
public class MyMessageHandler : IHandleMessage<IMyMessage>
{
private IContainer _container;
private ISomeService _someService;
public MyMessageHandler (IContainer container, ISomeService someService)
{
_container = container;
_someService = someService;
}
public async Task Handle(IMyMessage message, IMessageHandlerContext context)
{
_container.Inject(typeof(IMessageHandlerContext), context);
_someService.DoSomething();
}
}
public class SomeService : ISomeService
{
private IMessageHandlerContext _context;
public SomeService(IMessageHandlerContext context)
{
_context = context;
}
public void DoSomething()
{
_context.Send<ISomeMessage>(x => {
//... init message
});
}
}
现在问题是我们在发送nservicebus消息的实体上有一个Nhibernate自定义IPostUpdateEventListener。在版本5上,它有一个用于发送的ISendOnlyEndpoint,与其他服务相同,但这次上下文没有被Structuremap解析。我想知道如何以及nservicebus如何管理消息处理程序中的嵌套容器。我似乎找不到任何文件。
答案 0 :(得分:1)
StructureMap中的子容器不支持NServiceBus容器所需的某些功能。策略用于配置注入,子容器不支持策略。
Policies are only applied to root container in StructureMap
Here是NServiceBus.StructureMap repo中的一个问题,用于跟踪它。
答案 1 :(得分:0)
我猜这个建议的重构是
public class MyMessageHandler : IHandleMessage<IMyMessage>
{
public async Task Handle(IMyMessage message, IMessageHandlerContext context)
{
context.Resolve<ISomeService>().DoSomething(context);
}
}
public class SomeService : ISomeService
{
public void DoSomething(IMessageHandlerContext context)
{
context.Send<ISomeMessage>(x => {
//... init message
});
}
}
context.Resolve
将是您编写的用于访问上下文实例中的容器实例的扩展。
但是,如果您只想从消息处理程序外部发送消息,则可以注入启动总线时返回的IEndpointInstance
或IMessageSession
。
我认为他们建议只使用上下文从消息处理程序发送消息 - 但有时候这些消息不起作用。