我想知道大多数人如何处理存储库模式,当它涉及多次(有时以事务方式)击中同一个数据库并试图有效地这样做时,同时维护数据库不可知论和使用多个存储库一起。处理多个抽象存储库时有效的数据库访问
假设我们有三个不同实体的存储库; Widget
,Thing
和Whatsit
。按照正常的解耦设计流程,每个存储库都通过基本接口抽象出来。基础接口将是IWidgetRepository
,IThingRepository
和IWhatsitRepository
。
现在我们有我们的业务层或同等业务(无论您想调用它)。在这个层中,我们有访问各种存储库的类。通常这些类中的方法需要在涉及多个存储库的情况下执行批处理/组合操作。有时一种方法可能会在内部使用另一种方法,而该方法仍然可以独立调用。在这种情况下,什么时候操作需要是事务性的?
例子:
class Bob
{
private IWidgetRepository _widgetRepo;
private IThingRepository _thingRepo;
private IWhatsitRepository _whatsitRepo;
public Bob(IWidgetRepository widgetRepo, IThingRepository thingRepo, IWhatsitRepository whatsitRepo)
{
_widgetRepo = widgetRepo;
_thingRepo= thingRepo;
_whatsitRepo= whatsitRepo;
}
public void DoStuff()
{
_widgetRepo.StoreSomeStuff();
_thingRepo.ReadSomeStuff();
_whatsitRepo.SaveSomething();
}
public void DoOtherThing()
{
_widgetRepo.UpdateSomething();
DoStuff();
}
}
如何保持我到数据库的访问效率,而不是有开闭 - 开 - 关上MSDTS和诸如此类的连接,并无意调用络绎不绝?如果我的数据库是SQLite之类的,那么像创建嵌套事务这样的标准机制本来就会失败,但是业务层不应该关心这些事情。
你如何处理这些问题? ADO.Net是否提供了简单的机制来处理这个问题,或者大多数人最终将自己的代码封装在ADO.Net中以解决这些类型的问题?
我开发了一个数据层,在某种程度上做到了这一点,但是困扰我的是必须使用存储库之外的数据层中的对象。您的建议是一个很好的建议,并且可以让我将这一要求充分抽象出来,使其看起来像是数据层不可知的。 – 2010-06-18 09:58:32