2012-02-07 14 views
5

Với cửa hàng sự kiện với các lĩnh vực:Làm thế nào để lấy lại sự kiện lịch sử sau khi thay đổi cấu trúc tổ chức sự kiện miền

  • AggregateId: integer
  • Payload: blob
  • Version: integer

nào chứa các sự kiện dựa trên:

public class OrderLineAdded 
{ 
    int Id; 
    short Quantity; 
} 

... và sau đó có sự kiện cũng nói thêm với một cấu trúc Cập nhật:

public class OrderLineAdded 
{ 
    int ProductId; // field name has changed 
    int Quantity; // field datatype has changed 
} 

Khi dữ liệu lịch sử này được lấy ra (để phân tích, vv), làm thế nào để bạn tái tạo lại tải trọng nhị phân thành dữ liệu có ý nghĩa?

Lưu ý: mã ở trên không phải là ví dụ về triển khai sự kiện/cửa hàng sự kiện tốt. Tôi chỉ muốn biết cách xử lý kịch bản này.

+0

Bạn sẽ tăng số phiên bản cho phiên bản thứ hai và deserialise dựa trên phiên bản? –

+0

@LukeMcGregor Vâng, tôi đã suy nghĩ theo những dòng đó. Tôi muốn biết nếu có một cách tiếp cận khác/tốt hơn? –

Trả lời

3

Rinat Abdullin phác họa một số chiến lược phiên bản sự kiện miền trong trang CQRS bliki mà bạn có thể thấy hữu ích khi đọc.

https://abdullin.com/post/event-sourcing-versioning/

Ông đề nghị hai phương pháp có thể:

  1. Sử dụng một serializer có thể đối phó với việc đổi tên tài sản trong trường hợp của bạn tự động như Protobuf Serializer của Google.
  2. Thực hiện giao diện sau để tự nâng cấp các sự kiện trong bộ nhớ theo cách thủ công.
public interface IUpgradeDomainEvents 
{ 
    IEnumerable<IDomainEvent> Upgrade(IDomainEvent e, string id); 
} 
1

Phương pháp duy nhất tôi đã thấy để xử lý tính tương thích ngược là phiên bản từng thay đổi đối với sự kiện của bạn. Một số người tạo ra các phiên bản mới trong một không gian tên khác nhau, do đó không gian tên phản ánh thông tin phiên bản/Tính năng:

namespace Foo.ProjectA.Release1 
{ 
    public interface ISomeEvent {...} 
} 

namespace Foo.ProjectA.Release3 
{ 
    public interface ISomeEvent {...} 
} 

Ngoài ra, tạo ra một phiên bản mới của lớp với thông tin phiên bản/tính năng trong tên lớp:

namespace Foo.ProjectA 
{ 
    public interface ISomeEvent {...} 
    public interface ISomeEvent_MoreRefinedVersion {...} 
} 

Cá nhân, tôi thích cách tiếp cận cũ, trừ khi phiên bản mới bổ sung ý nghĩa ngữ nghĩa cụ thể hơn cho sự kiện.