我一直在浏览关于EF Code First,Repositories,Unit of Work等的令人难以置信的博客/文档/等等。
我正在尝试为下一个处理的项目创建一个方便的框架:
我决定不在我的回购中封装EF。我不知道何时会考虑切换到不同的ORM。
所以我想出了以下内容,我很乐意听取意见! :)
namespace Data.Repositories
{
internal class DbContextInstance
{
public static readonly DbContext Context;
static DbContextInstance()
{
if (System.Web.HttpContext.Current != null)
{
if (System.Web.HttpContext.Current.Items["__DBCONTEXT"] == null)
System.Web.HttpContext.Current.Items["__DBCONTEXT"] = new MyDbContext();
Context = System.Web.HttpContext.Current.Items["__DBCONTEXT"] as MyDbContext;
}
else
{
if (Context == null)
Context = new MyDbContext();
}
}
}
public class GenericRepository<TEntity> : IDisposable where TEntity : class
{
//Implementation of repo. Similar to GenericRepository here: http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application
//whenever I need to access the context I'm using DbContextInstance.Context
}
在上面的通用仓库中,我不需要担心传递DbContext(就像我提到的链接一样),因为DbContextInstance担心这一点。这是我可以配置连接字符串等的单点。我保持这部分简单,但我们可以增强它以从某处读取连接字符串名称。
Generic Repo是IDisposable - 在Dispose方法中我处理Context。上面的代码确保会话中只有一个Context(HTTP请求或EXE应用程序的生命周期)。当然,只要不处理。
工作类的单元将简单地实例化repos并与它们交互。它们也是IDisposable,并将处置回购。
我将对数据库进行测试和模型测试。我将有一个用于重置数据库并预先填充初始数据的脚本。我发现最好对真实的东西进行测试,而不是一些模仿事物的模型。
这段代码来自不同地方的点点滴滴+我自己的一些创造力......
当应用程序已启动并运行时,您能否看到任何可能导致痛苦的事情?扔在我的脸上! ;)
谢谢! :)
答案 0 :(得分:3)
Context应该是短暂的 - 你的代码似乎暗示你的Context将有很长的生命周期并被共享。这会让你感到悲伤。