在 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
我使用 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