是存储库具有更改事件的代码味道吗?

Joh*_*ell 5 c# design-patterns repository

我没有看到在存储库模式实现中使用的更改事件,但我想让我的存储库像这样:

interface IEntityRepository
{
    event EventHandler<EntityChangedEventArgs> EntityAdded;
    event EventHandler<EntityChangedEventArgs> EntityRemoved;

    IEnumerable<Entity> GetAll();
    Entity GetById(int id);
}
Run Code Online (Sandbox Code Playgroud)

这主要是因为我的实体只能从外部添加和删除,而不是IEntityRepository的客户端.

通过这样做我是否认为存储库模式存在根本错误,或者我是否有一个有效的案例?

drh*_*ris 4

如果您打算使用福勒的实际存储库模式,我会说是的。该模式旨在通过公开类似集合的方式,成为业务层和数据层之间的中介。它并不是为了实际保存数据。也就是说,如果您只想创建一个包装 API 并在情况发生变化时公开事件的集合,请务必这样做。有时您不需要遵循预定义的模式。

如果您希望它成为一种模式,我会说它看起来更像对象池或观察者模式。IObservable考虑使用反应式扩展 (Rx)的情况。它将允许您对 PInvoke 层做出反应,并强制您承担责任。代码实际上比事件更有效。通过使用事件,您必须维护此存储库,跟踪对象生命周期,可能使此存储库成为单例并为其提供一些线程管理。使用 Rx,您只需将操作推送到观察者的队列上即可。

但最后,使用你觉得最自然的东西。模式只是建议,并不总是存在于每个潜在的用例中。这是其中之一。