背景
我正在重构现有的DAL(不是我的)以使用UnitOfWork模式。我完全打破了这个构建,所以在我完成UoW之前,这是一个理论练习。但我并不完全确定我正在正确地使用UoW,所以当我不确定它是否真的有用时,我不打算实现我所拥有的。
我有什么
我有这个界面,IUnitOfWork:
public interface IUnitOfWork
{
void AddRepository<T>(T repository);
void AddRepositoryRange<T>(List<object> repositories);
T GetRepositoryByType<T>();
void Save();
}
它由以下人员实施:
public sealed class UnitOfWork : IUnitOfWork
{
private List<object> Repositories { get; set; }
private CliCEntities Context { get; set; }
public UnitOfWork(
IEnvironmentInformationProvider environmentInformationProvider)
{
this.Context = new CliCEntities(environmentInformationProvider.ConnectionString);
}
public void AddRepository<T>(T repository)
{
if (this.Repositories == null)
this.Repositories = new List<object>();
this.Repositories.Add(repository);
}
public void AddRepositoryRange<T>(List<object> repositories)
{
if (this.Repositories == null)
this.Repositories = new List<object>();
this.Repositories.AddRange(repositories);
}
public T GetRepositoryByType<T>()
{
var instance = this.Repositories.Where(x => x.GetType() == typeof(T));
return (T) instance;
}
public void Save()
{
this.Context.SaveChanges();
}
}
IoC会像这样实例化它:
var unitOfWork = new UnitOfWork(environmentInformationProvider);
var repositoryDependencyOne = new RepositoryDependencyOne(unitOfWork);
var repositoryDependencyTwo = new RepositoryDependencyTwo(unitOfWork);
container.RegisterInstance<IRepositoryDependencyOne>(repositoryDependencyOne);
container.RegisterInstance<IRepositoryDependencyTwo>(repositoryDependencyTwo);
unitOfWork.AddRepository(repositoryDependencyOne);
unitOfWork.AddRepository(repositoryDependencyTwo);
container.RegisterInstance<IUnitOfWork>(unitOfWork);
问题
正如我所说,在这一点上,这是一个理论上的练习,我无法测试它是否真的有用,所以可能还有改进空间,但基本的概念是什么?如果没有,可以采取哪些措施来改善UoW?
谢谢!
编辑: 我使用的IoC框架是Unity。
答案 0 :(得分:1)
我认为您对工作单元模式的理解有点偏差。我会从beginning开始,然后从那里开始。我使用Fowler的模式构建了自己的ORM。虽然我再也不会这样做了,但是了解这些模式是一种非常宝贵的经验。
答案 1 :(得分:0)
从概念上讲,您在工作单元中所需要的只是Add()
和Save()
。
在现实生活中,Add()
由您的存储库处理。但这并不意味着UoW实现与您的存储库之间应该存在直接连接,更不用说您应该公开添加此类连接的方法。
相反,您通常拥有的是UoW实现和指向内部相同第三方更改跟踪机制的repos(例如,Entity Framework的DbContext)。它可以通过具有有限范围的DI容器注入 - 通常是根据请求在Web应用程序中注入。
public class UnitOfWork
{
// private reference to DbContext here
public void Save()
{
//...
}
}
public class Repository
{
// private reference to DbContext here
public void Add()
{
//...
}
}