Подтвердить что ты не робот

Как получить идентификатор в создании при применении CQRS?

Мой прием на CQRS выполняется строго, ваши команды ничего не возвращают (return type void), поэтому мой пример действительно прямолинейный: как вы получаете идентификатор при создании чего-то?

Например, при создании транзакции с кредитной картой представляется очень важным вернуть идентификатор транзакции или при создании клиента было бы намного проще, если бы вы получили созданного клиента или идентификатор клиента, чтобы браузер мог автоматически перемещаться по эта страница клиента, например.

Одним из решений может быть сначала запросить идентификатор, а затем создать клиента или транзакцию с этим идентификатором, но это выглядит довольно странно.

Есть ли у кого-нибудь опыт в этом или сейчас, как это должно быть сделано наиболее эффективным способом? Может, я что-то не понял?

4b9b3361

Ответ 1

CQRS - это все о пожаре и забыть, а так как GUID очень надежны (низкий риск столкновения), нет проблем с отправкой в ​​GUID, который вы создаете самостоятельно.

В основном этапы:

  • Создайте свою команду
  • Создайте и назначьте свой идентификатор (GUID) ему
  • Выполнить команду
  • Возвращает идентификатор, ранее сгенерированный

Подробнее о GUID в Википедии

Ответ 2

Целочисленные id/GUID/байтовые массивы любого размера могут быть достаточно надежными на практике, но все они не соответствуют теоретическому требованию (происходит столкновение), в то время как действительное теоретическое решение существует и может применяться большую часть времени.

Я бы сформулировал решение как: при совместном использовании системы равного уровня одна система должна быть гарантирована системой более высокого уровня. Система более высокого уровня - это та, которая управляет временем жизни кооперативных систем.

Пример:

class John
{
    private readonly int id;

    public John(int id)
    {
        this.id = id;
    }

    public void UseSite(Site site)
    {
        site.CreateAccount(id, "john");

        site.SetPassword(id, "john", "123");

        /* ... */
    }
}

class Site
{
    public void CreateAccount(int humanId, string accName) { /* ... */ }

    public void SetPassword(int humanId, string accName, string pwd) { /* ... */ }

    /* ... */
}

class Program
{
    static void Main(string[] args)
    {
        Site s = new Site();

        // It easy to guarantee the identity while there only one object 
        John j = new John(4);

        Console.ReadLine();
    }
}

Program - это модуль более высокого уровня. Он отвечает за правильность использования John и Site. Предоставление John уникального идентификатора является частью этой ответственности.

Вы обнаружите, что невозможно или очень сложно справляться с личностью некоторых реальных систем, таких как человек. Это происходит, когда эти системы находятся на том же уровне, что и ваша система. Типичным примером является человек и веб-сайт. На вашем сайте никогда не будет гарантии того, что правильный человек запросит страницу. В этом случае вы должны использовать подход с вероятностью с надежным хешем.