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

时间:2011-09-25 23:47:31

标签: c# design-patterns repository

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

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

    IEnumerable<Entity> GetAll();
    Entity GetById(int id);
}

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

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

2 个答案:

答案 0 :(得分:3)

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

如果你想让它成为一个模式,我会说它看起来更像是一个Object Pool或Observer模式。考虑IObservable使用Reactive Extensions (Rx)的情况。它将允许您对PInvoke层做出反应,并强制您的责任。代码实际上比事件更有效。通过使用事件,您必须维护此存储库,跟踪对象生存期,可能使此存储库成为单例并为其提供一些线程管理。使用Rx,您只需在观察者的队列上执行操作。

但最后,使用对你来说最自然的东西。模式只是建议,并不总是存在于每个潜在的用例中。这是其中一种情况。

答案 1 :(得分:0)

我有一个类似的问题,我需要将事件发布到事件存储库以针对数据库进行CUD操作(不关心读取操作)。而不是修改我的repo而是创建了一个装饰器并将其注入(使用SimpleInjector)。这满足了开放/封闭原则和单一责任,实际上它提供了一种更清晰的方式来处理这一要求。