Как получить идентификатор при создании CQRS? - PullRequest
45 голосов
/ 06 декабря 2010

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

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

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

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

Ответы [ 2 ]

26 голосов
/ 06 декабря 2010

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

Шаги в основном будут:

  1. Создайте свою команду
  2. Создайте и присвойте ей свой идентификатор (GUID)
  3. Запустите команду
  4. Верните ранее созданный идентификатор

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

0 голосов
/ 15 июля 2014

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

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

Пример :

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's easy to guarantee the identity while there's only one object 
        John j = new John(4);

        Console.ReadLine();
    }
}

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

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

...