MVC CQRS应用程序 - 使它如此远程工作者可以毫不费力地工作

时间:2011-10-18 15:49:25

标签: domain-driven-design nservicebus cqrs

我用NSB设置了我的铃声,MVC3,RAvenDb和普通域等 - 像魅力一样

现在 - MVC层只将命令推送到NSB,并使用RavenDb提供的DocumentSession直接从readmodel读取

我的问题是 - 我不希望UI开发者必须配置和激活乌鸦控制台服务器以及使用NSB的读写服务器

其他人如何处理这个问题?

我希望MVC应用程序能够在没有任何内容的情况下启动。

你做什么?

2 个答案:

答案 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);
    }
}