我一直在浏览大量关于 EF Code First、存储库、工作单元等的博客/文档/等。
我正在尝试为我的下一个项目创建一个方便的框架来处理:
- Web 环境 (HttpContext) 和独立环境(例如 Windows 服务)
- 让我可以选择为特定实体定义存储库或使用通用存储库进行简单查询。
我决定不将 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。上面的代码确保会话中不超过一个上下文(HTTP 请求或 EXE 应用程序的生命周期)。当然,只要不处理。
工作单元类将简单地实例化 repos 并与它们交互。它们也将是 IDisposable 并将处理存储库。
我将对数据库进行测试和模型。我将有一个用于重置数据库并预先填充初始数据的脚本。我发现最好针对真实事物进行测试,而不是一些模拟事物的模型。
这段代码是来自不同地方的点点滴滴+我自己的一些创造力..
当应用程序已经启动并运行时,你能看到任何可能导致痛苦的事情吗?扔到我脸上!;)
谢谢!:)