我正在尝试了解工作单元模式。但是,我很难找到一个不太简单或不太复杂的示例。所以决定试着从我读过的东西中写一些我自己的东西。我想知道我所做的是否可以接受。我正在尝试将图层解耦。我创建 DatabaseManager 的原因是为了避免将上下文发送到其他层。最后,这将是具有中间层(业务)的 MVC 应用程序的 DAL
感谢您的输入。
代码:
public interface IDatabaseFactory : IDisposable
{
ObjectContext Get();
}
public class DatabaseFactory : Disposable, IDatabaseFactory
{
private ObjectContext _dataContext;
#region IDatabaseFactory Members
public ObjectContext Get()
{
return _dataContext ?? (_dataContext = (new MyMemberDatabase()));
}
#endregion
protected override void DisposeCore()
{
if (_dataContext != null)
_dataContext.Dispose();
}
}
public static class DatabaseManager
{
private static readonly Dictionary<Guid, ObjectContext> ContextLists = new Dictionary<Guid, ObjectContext>();
public static ObjectContext GetContext(Guid id)
{
if (!ContextLists.ContainsKey(id))
{
Guid newContextID = id;
ContextLists.Add(newContextID, new DatabaseFactory().Get());
}
return ContextLists[id];
}
public static void RemoveContext(Guid id)
{
if (ContextLists[id] != null)
ContextLists.Remove(id);
}
}
public class Disposable : IDisposable
{
private bool _isDisposed;
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
~Disposable()
{
Dispose(false);
}
private void Dispose(bool disposing)
{
if (!_isDisposed && disposing)
{
DisposeCore();
}
_isDisposed = true;
}
protected virtual void DisposeCore()
{
}
}
public interface IUnitOfWork : IDisposable
{
Guid ContextID { get; }
void Commit();
}
public class UnitOfWork : IUnitOfWork
{
private readonly Guid _contextID;
public UnitOfWork()
{
_contextID = new Guid();
_contextID = Guid.NewGuid();
}
#region IUnitOfWork Members
public Guid ContextID
{
get { return _contextID; }
}
public void Commit()
{
DatabaseManager.GetContext(_contextID).SaveChanges();
}
public void Dispose()
{
DatabaseManager.RemoveContext(_contextID);
}
#endregion
}
public abstract class RepositoryBase<T> where T : class
{
private readonly IUnitOfWork _unitOfWork;
private ObjectContext _context;
private IObjectSet<T> _objectSet;
private ObjectContext Context
{
get { return _context ?? (_context = DatabaseManager.GetContext(_unitOfWork.ContextID)); }
}
protected IObjectSet<T> ObjectSet
{
get { return _objectSet ?? (_objectSet = Context.CreateObjectSet<T>()); }
}
protected RepositoryBase(IUnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
}
}
class MemberRepository : RepositoryBase<Member>
{
public MemberRepository(IUnitOfWork unitOfWork) : base(unitOfWork)
{
}
public virtual void Add(Member entity)
{
ObjectSet.AddObject(entity);
}
public virtual void Delete(Member entity)
{
ObjectSet.DeleteObject(entity);
}
public virtual IEnumerable<Member> GetAll()
{
return ObjectSet.AsEnumerable();
}
}
编辑:新代码
public interface IMemberRepository : IRepository
{
void Add(Member entity);
void Delete(Member entity);
IEnumerable<Member> GetAll();
}
public interface IRepository
{
IUnitOfWork UnitOfWork { get; }
}
public interface IUnitOfWork : IDisposable
{
void Commit();
}
public class DatabaseFactory : Disposable, IDisposable
{
private ObjectContext _dataContext;
public ObjectContext Get()
{
return _dataContext ?? (_dataContext = (new MyMemberDatabase()));
}
protected override void DisposeCore()
{
if (_dataContext != null)
_dataContext.Dispose();
}
}
public static class DatabaseManager
{
private static readonly Dictionary<Guid, ObjectContext> ContextLists = new Dictionary<Guid, ObjectContext>();
public static ObjectContext GetContext(Guid id)
{
if (!ContextLists.ContainsKey(id))
{
Guid newContextID = id;
ContextLists.Add(newContextID, new DatabaseFactory().Get());
}
return ContextLists[id];
}
public static void RemoveContext(Guid id)
{
if (ContextLists[id] != null)
ContextLists.Remove(id);
}
}
public class Disposable : IDisposable
{
private bool _isDisposed;
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
~Disposable()
{
Dispose(false);
}
private void Dispose(bool disposing)
{
if (!_isDisposed && disposing)
{
DisposeCore();
}
_isDisposed = true;
}
protected virtual void DisposeCore()
{
}
}
public class UnitOfWork : IUnitOfWork
{
private readonly Guid _contextID;
public UnitOfWork()
{
_contextID = new Guid();
_contextID = Guid.NewGuid();
}
#region IUnitOfWork Members
internal Guid ContextID
{
get { return _contextID; }
}
public void Commit()
{
DatabaseManager.GetContext(_contextID).SaveChanges();
}
public void Dispose()
{
DatabaseManager.RemoveContext(_contextID);
}
#endregion
}
public abstract class RepositoryBase<T> : IRepository where T : class
{
private readonly UnitOfWork _unitOfWork;
private ObjectContext _context;
private IObjectSet<T> _objectSet;
public IUnitOfWork UnitOfWork
{
get { return _unitOfWork; }
}
private ObjectContext Context
{
get { return _context ?? (_context = DatabaseManager.GetContext(_unitOfWork.ContextID)); }
}
protected IObjectSet<T> ObjectSet
{
get { return _objectSet ?? (_objectSet = Context.CreateObjectSet<T>()); }
}
protected RepositoryBase(IUnitOfWork unitOfWork)
{
_unitOfWork = (UnitOfWork)unitOfWork;
}
protected RepositoryBase()
{
_unitOfWork = new UnitOfWork();
}
}
public class MemberRepository : RepositoryBase<Member> ,IMemberRepository
{
public MemberRepository(IUnitOfWork unitOfWork) : base(unitOfWork)
{
}
public MemberRepository():base()
{
}
public virtual void Add(Member entity)
{
ObjectSet.AddObject(entity);
}
public virtual void Delete(Member entity)
{
ObjectSet.DeleteObject(entity);
}
public virtual IEnumerable<Member> GetAll()
{
return ObjectSet.AsEnumerable();
}
}