在Unity.Mvc5

时间:2017-01-19 21:50:17

标签: asp.net-mvc entity-framework unity-container

我一直在使用EntityFramework。到目前为止,我只在离散使用块中使用了EF DBContext。我现在正在尝试使用请求范围依赖注入。 Unity似乎是最简单的,但我不确定我是否正确使用它。

到目前为止,我已经创建了一个示例存储库和服务类(具有相应的接口)。我在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

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

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

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

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

<Dependency>
Public Property MyModelService() As IMyService

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

由于<Dependency>属性修饰,它是否只是弄清楚了这一点?

1 个答案:

答案 0 :(得分:1)

是的,Unity能够隐式地解决上下文。 但是,当您明确注册它时,您可以更好地控制生命周期,因为您可以告诉Unity使用哪个终身管理器。 使用瞬态生命周期管理器创建隐式解析类型 (另请参阅:Unity: Change default lifetime manager for implicit registrations and/or disable them)上下文的生命周期与存储库的生命周期相同。

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