2012-01-28 33 views
2

我正在处理一个mvc 3的Web应用程序,其中包含大约15个表示15个DB表的实体模型类,目前我正在一个模型存储库中执行所有buisness登录从我拥有的所有控制器类中调用的类。我正在做一个存储库中的所有工作,以便: -我可以为我所有的实体类定义一个存储库类

  1. 避免部分更新。
  2. 将所有修改(插入,更新,删除)包装到一个数据库事务中。
  3. 避免为每个模型对象定义存储库类,并创建UnitOFWork类来在所有存储库之间进行配置,我发现它会使代码复杂化并增加额外的工作量。

所以我的方法有一个存储库类的问题,如性能,安全性等问题,或我应该知道的其他问题。

回答

2

如果需要,您可以这样做。但是,您可能最终会遇到难以实施的存储库实施。你说你想避免为每个模型对象定义一个回购类。这是我不会推荐的另一个极端。通常有一个更好的中间地带。

这里有一本书叫做Domain Driven Design。其建议之一是尝试使用“聚合根”存储库。这是根据其关系将实体组织到组中的位置,然后为每个组创建一个存储库。存储库中的主要实体被称为该组的“聚合根”,并且其他实体“悬挂”它。

例如,假设您的Order实体具有LineItem实体的集合。您只能通过订单访问订单项,因此您不需要单独的LineItemRepository。您可以查询订单,并可以急切或懒惰地加载行项目。订单然后可以具有导航属性到CustomerAccount实体,该实体具有PaymentProfile实体的集合。同样,相同的模式 - 您只需为客户帐户创建回购协议,并且不会直接查询PaymentProfile。通过CustomerAccount查询它。

另外我从你之前的一个问题中知道你正在使用EF。 EF为您管理交易。每次调用SaveChanges时,EF都会在事务中运行它。所以#2并不是一个真正有理由拥有1个巨大的存储库。

更新

至于的UnitOfWork,具有良好的前期设计,您可以在仓库管理UOW很容易地。我们的每个存储库都有一个UnitOfWork对象(基本上封装了EF DbContext)。我们的代码都没有直接构造对象。相反,我们使用Dependency Injection/Inversion of Control容器(Microsoft Unity)自动构建一个UoW,每次由控制器构建一个存储库(同样,使用依赖注入)。

通过将依赖关系生命周期配置为每个请求的一个实例,我们可以确定至少在我们的MVC项目中,每个存储库都获得相同的UoW实例(因此所有存储库都具有相同的DbContext实例)。

<register type="IUnitOfWork" mapTo="CustomDbContext"> 
    <lifetime type="singleton-per-http-context" /> 
</register> 
+0

你能确切说明你会如何对信息库使用的IoC?我非常熟悉IoC容器(ninject)。我只是不确定如何将MyDbContext注入到存储库中。 – 2013-07-10 19:51:20

相关问题