实体框架背景 - 我被困住了!

时间:2011-03-07 05:02:55

标签: asp.net-mvc

好的,所以我之前就此问了几个问题,但我真的只是想了解这一点。

我正在使用Service / Repository / EF 4 w / Pocos方法,我有Ninject设置并向控制器注入服务,但我试图找出注入上下文的位置?

我希望能够在控制器上使用多个服务,而这些服务又可以使用相同的上下文访问多个存储库,因此所有更改都会立即保留。

我研究了UnitOfWork模式,但我不明白MVC(控制器)如何实现这一点,因为他们只知道服务层和域实体。

修改

正如Mohamed在下面建议的那样,将上下文注入存储库,然后使用它的每个请求实例。如何在MVC应用程序中配置绑定?我会假设这样的事情:

Bind(Of IContext).To(MyDataContext)

问题是,MVC应用程序对上下文一无所知,对吧?

修改2

Public Class ProductController
    Private _Service As IProductService

    Public Sub New(Service As IProductService)
        _Service = Service
    End Sub

End Class

Public Class NinjectWebModule

    Public Sub New()
        Bind(Of IProductService).To(ProductService)
    End Sub

End Class

Public Interface IProductService

End Interface

Public Class ProductService
    Implements IProductService

    Private _Repository As IRepository(Of Product)

    Public Sub New(Repository As IRepository(Of Product))
        _Repository = Repository
    End Sub

End Class

Public Class NinjectServiceModule

    Public Sub New()
        Bind(Of IRepository(Of Product)).To(EFRepository(Of Product))
    End Sub

End Class

Public Interface IRepository(Of T As Class)

End Interface

Public Class EFRepository(Of T As Class)
    Implements IRepository(Of T)

    Private _UnitOfWork As MyUnitOfWork

    Public Sub New (UnitOfWork As IUnitOfWork)
        _UnitOfWork = UnitOfWork
    End Sub

End Class

Public Class NinjectRepositoryModule

    Public Sub New()
        Bind(Of IUnitOfWork).To(EFUnitOfWork).InRequestScope()
    End Sub

End Class

Public Interface IUnitOfWork
    Sub Commit()
End Interface

Public Class EFUnitOfWork()
    Implements IUnitOfWork

    Public Property Context As MyContextType

    Public Sub New()
        _Context = New MyContextType
    End Sub

End Class

然后我会从MVC应用程序注册所有三个模块?

2 个答案:

答案 0 :(得分:7)

您需要的组件:

  1. 存储库(通用或特定)
  2. 工作单位
  3. 服务
  4. 控制器
  5. 各自是什么:

    1. 存储库:针对提供的上下文执行查询
    2. 工作单元:包装Entity Framework ObjectContext
    3. 服务:调用存储库上的方法
    4. 控制器:调用Services上的方法,并在工作单元上调用“Commit”。
    5. 有了这个,你的Controller的ctor应该是这样的:

      public ProductController(IUnitOfWork unitOfWork, IProductService productService)
      

      您需要UoW,因为您提到要在多个存储库中进行更改(这是一种相当常见的方案)。因此,通过将UoW(它是引擎盖下的ObjectContext)传递给存储库,您可以启用它。

      使用DI容器将工作单元设置为 Http Context作用域。

答案 1 :(得分:2)

如何在存储库类中注入ObjectContext?并根据请求使用单个实例?

<强>更新

请参阅此示例ASP.NET MVC 3 Application using Ninject, Entity Framework 4 Code-First CTP 5, Patterns

更新2

此示例适用于NHibernate会话,但它与EF ObjectContext或LinqToSQL DataConext或类似内容完全相同。真的很好的例子。检查一下,告诉我你的想法。

http://www.itslet.nl/?p=904

更新3

您定义DI绑定的地方HAS当然要了解所有具体实现。如果你真的希望你的MVC代码不了解上下文,你可以

  • 将该代码放入了解它的新项目中,
  • 或使用XML进行绑定(Ninject站点本身有关于如何执行此操作的文档,但它不是此特定DI容器的默认预期用途),
  • 或使用Ninject Modeules(基本上这意味着拆分你的绑定,因此,你可以有一个模块在与上下文相同的项目中进行上下文竞标,而MVC只使用所有可发现的Ninject模块进行绑定)。

这是使用Ninject Modules的一个例子:What is the intention of Ninject modules?