我只是在寻找一些关于其他人在使用EF4时管理其背景的行为的反馈。我正在创建一个MVC应用程序,使用(我认为:))工作单元,服务层,存储库,EF4 w / POCO技术。
我的控制器利用UOW服务,然后利用存储库从EF获取POCO。
这是否正确实施?
看看下面,感谢任何反馈!
控制器
Public Class MyController
Function ListCustomers() As ActionResult
Dim _UOW = New UnitOfWork
Dim _Service = New CustomerService(_UOW)
Dim _Model = New CustomersViewModel
_Model.Customers = _Service.GetCustomers
_UOW.Dispose()
Return View(_Model)
End Function
End Class
工作单元
Public Interface IUnitOfWork
Property Context As GTGContext
Sub Committ()
End Interface
Public Class UnitOfWork
Implements IDisposable, IUnitOfWork
Public Property Context As Domain.GTGContext Implements IUnitOfWork.Context
Public Sub New()
_Context = New GTGContext
End Sub
Public Sub Committ() Implements IUnitOfWork.Committ
_Context.SaveChanges()
End Sub
#Region "IDisposable Support"
Private _IsDisposed As Boolean
Protected Overridable Sub Dispose(ByVal Disposing As Boolean)
If (Not _IsDisposed) Then
If (Disposing) Then
If (_Context IsNot Nothing) Then
_Context.Dispose()
End If
End If
'TODO: Free unmanaged resources (unmanaged objects) and override Finalize() below.
End If
_IsDisposed = True
End Sub
'TODO: Override Finalize() only if Dispose(ByVal disposing As Boolean) above has code to free unmanaged resources.
'Protected Overrides Sub Finalize()
' Dispose(False)
' MyBase.Finalize()
'End Sub
Public Sub Dispose() Implements IDisposable.Dispose
Dispose(True)
GC.SuppressFinalize(Me)
End Sub
#End Region
End Class
服务
Public Class CustomerService
Private _UOW As IUnitOfWork
Private _Repo As Repository(Of Customer)
Public Sub New(UOW As IUnitOfWork)
_UOW = UOW
_Repo = New Repository(Of Customer)(_UOW)
End Sub
Public Function GetCustoemrs() As IQueryable(Of Customer)
' Any Business Logic Here
Return _Repo.GetCustomers()
End Function
End Class
存储库
Imports System.Data.Objects
Namespace Repositories
Public Interface IRepository(Of T As Class)
ReadOnly Property ObjectSet As IObjectSet(Of T)
ReadOnly Property UnitOfWork As IUnitOfWork
Function Query(ByVal Expression As Expressions.Expression(Of Func(Of T, Boolean))) As IQueryable(Of T)
Function GetFirst(ByVal Expression As Expressions.Expression(Of Func(Of T, Boolean))) As T
Function GetSingle(ByVal Expression As Expressions.Expression(Of Func(Of T, Boolean))) As T
Sub Add(ByVal Entity As T)
Sub Attach(ByVal Entity As T)
Sub Delete(ByVal Entity As T)
Sub SaveChanges()
End Interface
Public Class Repository(Of T As Class)
Implements IRepository(Of T)
#Region "Private Members/Properties"
Private _ObjectSet As IObjectSet(Of T)
Private ReadOnly Property ObjectSet As System.Data.Objects.IObjectSet(Of T) Implements IRepository(Of T).ObjectSet
Get
If (_ObjectSet Is Nothing) Then
_ObjectSet = UnitOfWork.Context.CreateObjectSet(Of T)()
End If
Return _ObjectSet
End Get
End Property
Private _UnitOfWork As IUnitOfWork
Private ReadOnly Property UnitOfWork As IUnitOfWork Implements IRepository(Of T).UnitOfWork
Get
Return _UnitOfWork
End Get
End Property
#End Region
#Region "Constructor(s)"
Public Sub New(ByVal UnitOfWork As IUnitOfWork)
If (UnitOfWork Is Nothing) Then
Throw New ArgumentNullException("UnitOfWork")
End If
_UnitOfWork = UnitOfWork
End Sub
#End Region
#Region "IRepository(Of T)"
Public Sub Add(ByVal Entity As T) Implements IRepository(Of T).Add
ObjectSet.AddObject(Entity)
End Sub
Public Sub Attach(ByVal Entity As T) Implements IRepository(Of T).Attach
ObjectSet.Attach(Entity)
UnitOfWork.Context.ObjectStateManager.ChangeObjectState(Entity, EntityState.Modified)
End Sub
Public Sub Delete(ByVal Entity As T) Implements IRepository(Of T).Delete
ObjectSet.DeleteObject(Entity)
End Sub
Public Function GetFirst(ByVal Expression As System.Linq.Expressions.Expression(Of System.Func(Of T, Boolean))) As T Implements IRepository(Of T).GetFirst
Return ObjectSet.FirstOrDefault(Expression)
End Function
Public Function GetSingle(ByVal Expression As System.Linq.Expressions.Expression(Of System.Func(Of T, Boolean))) As T Implements IRepository(Of T).GetSingle
Return ObjectSet.SingleOrDefault(Expression)
End Function
Public Function Query(ByVal Expression As System.Linq.Expressions.Expression(Of System.Func(Of T, Boolean))) As System.Linq.IQueryable(Of T) Implements IRepository(Of T).Query
Return ObjectSet.Where(Expression)
End Function
Public Sub SaveChanges() Implements IRepository(Of T).SaveChanges
UnitOfWork.Committ()
End Sub
#End Region
End Class
End Namespace
答案 0 :(得分:2)
让我告诉你,我在很长一段时间内采取了什么方法,特别是在StackOverflow上,我很痛苦:)
我决定实施这篇关于管理对象上下文的精彩文章(注意允许多个上下文的修改版本)。
然后我实施了外墙,如:
public class MyEntityFacade : FacadeBase<MyEntities, MyEntity>
{
public object GetAll()
{
return this.ObjectContext.MyEntities.ToList();
}
public bool HasChild(int parentId)
{
return this.ObjectContext.MyEntityChild.Any(c => c.parentId == parentId);
}
}
当然,它已经老了,但男孩哦,男孩,它有效!
请参阅,所有服务层/工作单元/存储库的东西是你最终必须编写一堆很多代码来支持它(当然EF4应该减少代码膨胀!)。每次添加新实体时,猜猜是什么?更繁琐的代码膨胀。
通过上面的方法,我将所有的Facade / unit of work支持代码填充到一个可重用的类库中,我所要做的就是编写我的外观代码,它只关注实际执行某些操作的代码 - 而且它适用于多种情境。
为我工作......哦,不要嘲笑我使用“立面”这个词。我从未真正去过学校;)
谢谢, 理查德
P.S。祝周末愉快!