在 Unity.Mvc5 中使用 EF DBContext 的正确方法

Correct way to use EF DBContext with Unity.Mvc5

我使用 EntityFramework 的时间很短。到目前为止,我只在离散使用块中使用过 EF DBContext。我现在正在尝试使用请求范围依赖注入。 unity好像是最简单的,但是不知道自己用对了没。

到目前为止,我已经创建了示例存储库和服务 class(具有相应的接口)。我在 Unity 中注册这些,就像这样...

Public Shared Sub RegisterComponents()
    Dim container = New UnityContainer()

    container.RegisterType(Of IMyService, MyService)()
    container.RegisterType(Of IRepository(Of MyModel), MyRepository)()

    DependencyResolver.SetResolver(New UnityDependencyResolver(container))
End Sub

我的存储库看起来像这样...

Public Class MyRepository
    Implements IRepository(Of EF.MyModel)
    <Dependency>
    Public Property Context() As MyDBEntities

    Public Function Create(item As MyModel) As Boolean Implements IRepository(Of MyModel).Create
        Context.MyModel.Add(item)
        Return Context.SaveChanges() > 0
    End Function

    Public Function Delete(id As Integer) As Boolean Implements IRepository(Of MyModel).Delete
        Context.MyModel.Remove([Get](id))
        Return Context.SaveChanges() > 0
    End Function

    Public Function [Get](id As Integer) As MyModel Implements IRepository(Of MyModel).Get
        Return Context.MyModel.Find(id)
    End Function

    Public Function List() As IQueryable(Of MyModel) Implements IRepository(Of MyModel).List
        Return Context.MyModel
    End Function
End Class

我的服务 class 包括对存储库的以下引用...

<Dependency>
Public Property Repository() As IRepository(Of MyModel)

服务的其余部分 class 目前几乎只是存储库方法的包装器,但最终将具有更多高级功能。

在我的控制器中,我像这样引用我的服务...

<Dependency>
Public Property MyModelService() As IMyService

无论如何这一切似乎都工作正常,我可以在存储库、服务或控制器级别向查询添加额外的位,并且它似乎总是具有正确的上下文。但是我不确定它如何知道跟踪和关闭 DBContext,因为它没有明确注册到 Unity。

它是不是因为 <Dependency> 属性 装饰而自己解决了这个问题?

是的,unity 能够隐式解析上下文。 但是,当您显式注册它时,您将对生命周期有更多控制,因为您可以告诉 Unity 使用哪个生命周期管理器。 由于隐式解析类型是使用瞬态生命周期管理器创建的 (另请参阅:)上下文的生命周期与存储库的生命周期相同。

供参考:https://msdn.microsoft.com/en-us/library/ff660872%28v=pandp.20%29.aspx