4

開発サイクル (asp.net mvc applciation) のある時点で、既存のコマンドとイベントに変更を導入する必要があります (いくつかのプロパティの追加/削除など)。

システムにコマンド/イベントのバージョン管理を導入する方法を見つけようとしています。私は google/stackoverflow などで多くの投稿を読みましたが、それを実装するコードの例をまだ見ていません。バージョン管理時に従うべき推奨パターンはありますか。はいの場合、例/スニペットはありますか?

編集:これは私がこれでどこまで到達したかです

  1. 最新のものは常に同じように呼び出され、廃止されたものには「_V1」、「_V2」などの接尾辞が追加されるように、イベントを逆バージョンにしました。

だからイベントがあれば

public class OrderSubmittedEvent : IDomainEvent
{
    public int OrderId { get; private set; }

    public OrderSubmittedEvent(int orderId)
    {
        OrderId = orderId;
    }
}

いくつかのプロパティを追加する必要がある場合は、上記のイベントの名前を

public class OrderSubmittedEvent_V1 : IDomainEvent
{
    public int OrderId { get; private set; }

    public OrderSubmittedEvent_V1(int orderId)
    {
        OrderId = orderId;
    }
}

元のイベントと同じ名前でプロパティが追加された別のイベントを紹介します。

public class OrderSubmittedEvent : IDomainEvent
{
    public int OrderId { get; private set; }

    public OrderSubmittedEvent(int version = 1, int orderId = 0, string customerName =  
                               "Joe blogs", string address = "Earth")
    {
        OrderId = orderId;
        CustomerName = customerName;
        Address = address;
        CurrentVersion = version;
    }

    public static int LatestVersion
    {
        get { return 2; }
    }

    public int CurrentVersion { get; set; }

    public string CustomerName { get; set; }
    public string Address { get; set; }
}

このイベントを発行するコードを変更して、新しいプロパティの値を含める必要があります。

  1. イベント ストアからすべてのイベントを取得する任意の時点 (たとえば、リプレイ用) は、逆シリアル化 (この場合は OrderSubmittedEvent) 後は常に同じ型になり、入力された古いイベントの一部ではなかった新しいプロパティが使用されます。デフォルト値。

イベントを再生するときに、イベントが IEventUpgrader を通過するようにします。これは、最初に、イベントが利用可能な最新バージョンであるかどうかを確認します。タイプは常にイベント タイプであるため、このチェックはプロパティ「LatestVersion」および「CurrentVersion」に基づいています。

誰もがこのアプローチについてどう思いますか?

次のトド

  1. イベントが古いバージョンの場合、「UpdateMYEVENT」イベントを発行します

ありがとう

4

5 に答える 5

8

通常、イベントをバージョン管理するだけで済みます。コマンドはイベント ストアに保存しないため、無視できます。

バージョン管理を実装する方法はいくつかあります..私の方法は非常に簡単です:

[Obsolete]
public class CompanyCreated
{
    public Guid Id { get; set; }
    public string Name { get; set; }
}

public class CompanyCreated_V2
{
    public Guid Id { get; set; }
    public string CompanyName { get; set; }
    public string TaxNumber { get; set; }
}

イベント ストアからイベントを読み取るときに、古いものから新しいものへのイベントの変換を処理する必要があります。

また、古いイベント クラスは決して削除しないことに注意する必要があります。そのため、他の開発者にイベントを使用しないように知らせるために、古いイベント クラスを Obsolete として装飾するのです。

于 2013-05-13T15:45:48.700 に答える
4

プロパティの追加と削除のみを行う場合は、イベントをバージョン管理する必要はないかもしれません。削除されたシリアル化されたプロパティを無視し、追加するプロパティには適切なデフォルトを使用してください。

于 2013-05-14T05:17:00.167 に答える
1

イベントとコマンドを混在させる場合は注意が必要です。それらにはさまざまな目的があり、さまざまな問題を解決します。

私が言いたいことをよりよく理解するために、コマンドは RESTful API、つまりクライアントとサーバー間の通信に似ていると考えてください。イベントソーシングは、データを保存するためのより多くの方法です。

どちらも、不変性による後方互換性を提供する方法としてバージョン管理が必要ですが、これも理由が異なります。したがって、実装と例外は異なります。

イベント ソース システムのバージョン管理の詳細については、Greg Young による Event Versioningという本をお勧めします。

コマンドの詳細については、CQRS シリーズ、特にCQRS via HTTPを確認してください。

于 2020-08-26T06:05:11.830 に答える