【发布时间】:2011-12-31 01:09:59
【问题描述】:
为了使我的实体持久无知并使我的存储库可测试,我实现了一个存储库模式,如下所示:
public interface IJobRepository : IRepository<Job>
{
Job GetJobById(int jobId); //Special case where I'm eager loading other entities
void SaveJob(Job job, Job originalJob);
}
public class JobRepository : IJobRepository
{
private readonly IContext _context;
public JobRepository()
{
_context = new CustomObjectContext();
}
public JobRepository(UnitOfWork unitOfWork)
{
_context = unitOfWork.Context;
}
//Basic GetAll, GetById, Add and Delete methods from IRepository<T> Interface here
//omitted for brevity
public Job GetJobById(int jobId)
{
var job = _context.Jobs.Include("Company").Include("Location").
Include("PlantInfo").Where(j => j.Jobid == jobId).SingleOrDefault();
_context.DisposeContext();
return job;
}
public void SaveJob(Job job, Job originalJob)
{
if (job.Jobid > 0)
{
// Update
_context.Jobs.Attach(originalJob);
_context.PlantInfoes.Attach(originalJob.PlantInfo);
_context.Jobs.ApplyCurrentValues(job);
_context.PlantInfoes.ApplyCurrentValues(job.PlantInfo);
Note: ApplyCurrentValues is an extension method I'm using on the ObjectSet
}
else
{
// Create
_context.Jobs.AddObject(job);
}
_context.Save();
}
}
public class UnitOfWork
{
private readonly IContext _context;
public UnitOfWork()
{
_context = new CustomObjectContext();
}
public UnitOfWork(IContext context)
{
_context = context;
}
public string Save()
{
return _context.Save();
}
internal IContext Context
{
get { return _context; }
}
}
public interface IContext
{
IObjectSet<Job> Jobs { get; }
IObjectSet<Company> Companies { get; }
IObjectSet<Location> Locations { get; }
IObjectSet<PlantInfo> PlantInfoes { get; }
string Save();
}
我的 ObjectContext 继承自 IContext...所以我的理解是我只会在存储库上使用重载的构造函数以方便单元测试或在我想使用相同上下文的情况下使用它(基于这篇我在 SO "Entity Framework and Connection Pooling" 上找到的帖子——对吗?
另外,假设上下文仅在存储库被垃圾收集时被释放,我必须显式地释放上下文以避免“一个实体对象不能被多个 IEntityChangeTracker 实例引用”。在保存之前附加实体时出现异常。
也就是说,以保持实体持久无知和存储库可测试的方式管理 DataContext 的最佳实践是什么?
注意:这是一个 asp.net 网络应用程序; UnitOfWork 和 IContext 的实现基于 Julia Lerman Ch24 第二版的“Programming Entity Framework”中的示例。
提前致谢!
【问题讨论】:
标签: asp.net entity-framework web-applications entity-framework-4 entity-framework-4.1