RayTale/Ray

事件不应该是继承的方式

newbe36524 opened this issue · 5 comments

用户自定义数据作为 IEvent { T Body } 的方式存在,可以更加有利于框架代码的维护。
用户自定义事件的本质其实是自定义了其中的数据,这些自定义数据和时间的原生数据共同组成了事件。
如此设计会更加符合单一职责原则。

@newbe36524 可以举个例子更详细的描述下改动建议吗?

// 事件

public interface IEvent
{
    string EventType {get;set;}
    long Version {get;set;}
}

// 具有自定义数据的事件

public interface IEventWithData<T>: IEvent
{
    T Body {get;set;}
}

框架内部只要运作 IEvent 和 IEventWithData 就可以了。

// 具体事件

public class RayEvent<T>: IEvent<T>
{
    string EventType {get;set;}
    T Body {get;set;}
    long Version {get;set;}
}

// 用户定义的事件,实际上是有他关心的事件数据。用户其实不需要知道版本之类的信息

public class AccountLockEvent
{
    public string LockBy {get;set;}
}

@newbe36524
现在事件已经不需要关心版本号那些信息了

    public class TopupEvent : IEvent
    {
        public decimal Amount { get; set; }
        public decimal Balance { get; set; }
    }

I am assuming TopupEvent to function as a command being sent to perform a deposit.

What about the events that are raised after the command is processed?

Wouldn't those need version?

@ElanHasson I think maybe you mean idempotency of event? You can specify a uid in Ray while event raising. It should be handle only once with the same uid.