Asp.net mvc 3 我可以为我拥有的所有实体类定义一个存储库类吗

Asp.net mvc 3 我可以为我拥有的所有实体类定义一个存储库类吗,asp.net-mvc-3,design-patterns,repository-pattern,Asp.net Mvc 3,Design Patterns,Repository Pattern,我正在开发一个MVC3Web应用程序,它包含大约15个实体模型类,代表15个DB表,我目前正在一个模型库类中执行所有业务逻辑,该模型库类是从我拥有的所有控制器类调用的。我在一个存储库中完成所有工作,以:- 避免部分更新 将所有修改(插入、更新、删除)打包到一个DB事务中 为了避免为每个模型对象定义存储库类,并创建UnitOFWork类来协调所有存储库,我发现这会使代码复杂化并增加额外的工作量 因此,我使用一个存储库类的方法会遇到性能、安全性等问题,或者其他我应该注意的问题。如果您愿意,可以这样做

我正在开发一个MVC3Web应用程序,它包含大约15个实体模型类,代表15个DB表,我目前正在一个模型库类中执行所有业务逻辑,该模型库类是从我拥有的所有控制器类调用的。我在一个存储库中完成所有工作,以:-

  • 避免部分更新
  • 将所有修改(插入、更新、删除)打包到一个DB事务中
  • 为了避免为每个模型对象定义存储库类,并创建UnitOFWork类来协调所有存储库,我发现这会使代码复杂化并增加额外的工作量

  • 因此,我使用一个存储库类的方法会遇到性能、安全性等问题,或者其他我应该注意的问题。

    如果您愿意,可以这样做。但是,最终可能会出现笨拙的存储库实现。您说希望避免为每个模型对象定义一个repos类。这是我不推荐的另一个极端。通常有一个更好的中间立场

    有一本书叫做领域驱动设计。其建议之一是尝试使用“聚合根”存储库。在这里,您可以根据实体之间的关系将其组织到组中,然后为每个组创建一个存储库。存储库中的主实体被称为组的“聚合根”,并有其他实体在其中“悬挂”

    例如,假设您有一个订单实体,其中包含一组LineItem实体。您实际上只能通过订单访问行项目,因此不需要单独的LineItemRepository。您可以查询订单,并立即或延迟加载行项目。然后,订单可能具有CustomerAccount实体的导航属性,该实体具有PaymentProfile实体的集合。同样,也是同样的模式——您只需为客户帐户创建一个回购,而从不直接查询PaymentProfile。通过CustomerAccount查询它

    另外,我从您之前的一个问题中了解到,您正在使用EF。EF为您管理事务。每次调用SaveChanges时,EF都会在事务中运行它。因此#2并不是拥有一个大型存储库的好理由

    更新

    就UnitOfWork而言,通过良好的前期设计,您可以非常轻松地跨存储库管理UoW。我们的每个存储库都有一个UnitOfWork对象(它基本上包装了EF DbContext)。我们的代码都没有直接构造对象。相反,我们使用依赖注入/控制反转容器(MicrosoftUnity)在每次控制器构建存储库时自动构建UoW(同样,使用依赖注入)

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


    为什么不实施通用存储库呢。看看这篇文章,希望能对你有所帮助


    感谢您的链接,但这正是我试图避免的,因为创建通用存储库和UnitOFWork类以协调所有存储库需要大量工作。br您能否明确说明如何在存储库中使用IoC?我非常熟悉IoC容器(ninject)。我只是不确定如何将MyDbContext注入存储库。
    <register type="IUnitOfWork" mapTo="CustomDbContext">
        <lifetime type="singleton-per-http-context" />
    </register>