Приложение MVC CQRS - делает так, чтобы удаленные работники могли работать без суеты - PullRequest
2 голосов
/ 18 октября 2011

Я установил свой тинг с NSB, MVC3, RAvenDb, общим доменом и т. Д. - работает как шарм

Теперь - слой MVC только передает команды в NSB и читает из модели чтения напрямую, используя DocumentSession, предоставленный RavenDb

Мой вопрос - я не хочу, чтобы разработчики пользовательского интерфейса настраивали и запускали консольный сервер raven и серверы чтения и записи с NSB

Как другие люди справляются с этим?

Я хочу, чтобы приложение MVC работало без всего этого.

Что ты делаешь?

Ответы [ 2 ]

0 голосов
/ 19 октября 2011

Мы используем простую оболочку вокруг специфики 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);
    }
}
0 голосов
/ 19 октября 2011

Мы общаемся с «бэкэндом» нашего веб-сервиса через интерфейсы. При запуске в Интернете мы используем шаблон IOCC / DI, чтобы использовать экземпляры реального интерфейса или режима разработки этого интерфейса.

Например, ваше «OrderCommandApplication», которое будет содержать команды для создания заказов, будет иметь интерфейс IOrderCommandApplication. теперь, в зависимости от разработчика, который запускает веб, мы внедряем либо приложение DemoOrderCommandApplication, которое сохраняет состояние только в памяти, либо приложение OrderCommandApplication, которое использует ravendb / wcf, что угодно. Посмотрите, например, StructureMap или найдите некоторые базовые элементы поиска инверсии контейнеров управления и шаблона внедрения зависимости.

...