gpt4 book ai didi

c# - 使用接口(interface)参数指定方法

转载 作者:太空宇宙 更新时间:2023-11-03 14:54:40 24 4
gpt4 key购买 nike

我花了一些时间学习“事件溯源”的工作原理以及如何在 C# 中实现它,但我在某个时候遇到了困难。由于没有代码很难描述我的问题,因此我将首先为您提供我的代码的简化版本。我删除了所有不需要的代码并保留了相关部分。

public interface IEvent { }
public class UserCreated : IEvent { }
public class UserDeleted : IEvent { }

public interface IEventSourcable
{
ICollection<IEvent> History { get; }
void ApplyEvent(IEvent e);
}

public abstract class EntityBase : IEventSourcable
{
public ICollection<IEvent> History { get; }
public void ApplyEvent(IEvent e)
{
History.Add(e);
}
}

public class User : EntityBase
{
public void ApplyEvent(UserCreated e)
{
base.ApplyEvent(e)
}
}

我想做的是在没有实现匹配方法的情况下阻止使用基方法。 e.

User u = new User();
u.ApplyEvent(new UserCreated());

应该工作并调用 User 中的方法(确实如此)但是

u.ApplyEvent(new UserDeleted()); 

不应调用基本方法,但在编译时会报错。

我见过不同的方法,如果没有像这样实现匹配方法,它们会产生运行时错误或简单地忽略问题

  1. 只需重写方法并检查类型

    public class User : EntityBase
    {
    public override void ApplyEvent(IEvent e)
    {
    if (e is UserCreated)
    ApplyEvent((UserCreated)e);
    else if (e is UserDeleted)
    ApplyEvent((UserDeleted)e);
    else
    throw new UnknownEventException(); // Or handle it however
    }
    }
  2. 使用动态运算符

    public abstract class EntityBase : IEventSourcable
    {
    public ICollection<IEvent> History { get; }
    public void ApplyEvent(IEvent e)
    {
    History.Add(e);
    ((dynamic)this).Apply((dynamic)e);
    }
    }

    public class User : EntityBase
    {
    public override void Apply(UserCreated e)
    {
    // do something
    }
    }

我知道我可以通过上述任何一种方式来做到这一点,但我更感兴趣的是我的想法是否可行。

最佳答案

您可以显式实现接口(interface),这将防止在具体实例上出现不需要的事件类型:

public abstract class EntityBase : IEventSourcable
{
ICollection<IEvent> IEventSourcable.History { get; }

void IEventSourcable.ApplyEvent(IEvent e)
{
// Do the magic
}

protected void ApplyEvent(IEvent e)
{
(this as IEventSourcable).ApplyEvent(e);
}
}

public class User : EntityBase
{
public void ApplyEvent(UserCreated e)
{
base.ApplyEvent(e);
}
}

但是,这不会阻止消费者转换为 IEventSourcable 并添加任意事件:

IEventSourcable u = new User();
u.ApplyEvent(new UserCreated());
u.ApplyEvent(new UserDeleted());

关于c# - 使用接口(interface)参数指定方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50144967/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com