我用NSB设置了我的铃声,MVC3,RAvenDb和普通域等 - 像魅力一样
现在 - MVC层只将命令推送到NSB,并使用RavenDb提供的DocumentSession直接从readmodel读取
我的问题是 - 我不希望UI开发者必须配置和激活乌鸦控制台服务器以及使用NSB的读写服务器
其他人如何处理这个问题?
我希望MVC应用程序能够在没有任何内容的情况下启动。
你做什么?
答案 0 :(得分:0)
我们通过接口与我们的网络服务中的“后端”进行通信。 在启动Web时,我们使用IOCC / DI模式来使用该接口的实模式或开发模式实例。
例如,包含创建订单命令的“OrderCommandApplication”将具有接口IOrderCommandApplication。现在,取决于启动Web的开发人员,我们注入DemoOrderCommandApplication,它只在内存中保持状态,或者使用ravendb / wcf的OrderCommandApplication。 请查看示例StructureMap或某些基础搜索控件容器的反转和依赖注入模式。
答案 1 :(得分:0)
我们使用围绕NSB细节的简单包装器,类似于建议的内容。您不必使用完整的IOC,但您至少可以使用工厂。这是接口定义(如果您需要,我可以跟进NSB实现):
public interface IServiceBusAgent<T>
{
void Send(Action<T> messageConstructor);
void Send(String destination, Action<T> messageConstructor);
void Send(String destination, String correlationId, Action<T> messageConstructor);
void SendLocal(Action<T> messageConstructor);
}
public class NServiceBusAgent<T> : IServiceBusAgent<T> where T : IMessage
{
private readonly IBus bus;
public NServiceBusAgent() : this(null) { }
public NServiceBusAgent(IBus bus)
{
this.bus = bus;
}
public void Send(Action<T> messageConstructor)
{
if (null != messageConstructor)
this.bus.Send<T>(messageConstructor);
}
public void Send(String destination, Action<T> messageConstructor)
{
Send(destination, String.Empty, messageConstructor);
}
public void Send(String destination, String correlationId, Action<T> messageConstructor)
{
if (String.IsNullOrEmpty(destination))
throw new ArgumentNullException("destination");
if (null != messageConstructor)
this.bus.Send<T>(destination, correlationId, messageConstructor);
}
public void SendLocal(Action<T> messageConstructor)
{
if (null != messageConstructor)
this.bus.SendLocal<T>(messageConstructor);
}
}