2017-01-19 28 views
0

我一直在使用EntityFramework很短的時間。直到現在,我只在離散使用塊中使用了EF DBContext。我現在試圖使用請求範圍依賴注入。 Unity似乎是最簡單的,但我不確定我是否正確使用它。使用EF DBContext和Unity.Mvc5的正確方法

到目前爲止,我已經創建了一個樣本庫和服務類(具有相應的接口)。我在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

是的,統一能夠隱含地解決上下文。 但是,當您明確註冊時,您將擁有對生命期的更多控制權,因爲您可以告訴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