关于这种方法的思考:EF5 Code First,Repository Pattern,UofW等等

时间:2012-08-31 12:26:33

标签: .net entity-framework-5

我一直在浏览关于EF Code First,Repositories,Unit of Work等的令人难以置信的博客/文档/等等。

我正在尝试为下一个处理的项目创建一个方便的框架:

  1. Web环境(HttpContext)和独立(对于Windows服务)
  2. 为我提供了为特定实体定义存储库或使用通用存储库进行简单查询的选项。
  3. 我决定不在我的回购中封装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,并将处置回购。

    我将对数据库进行测试和模型测试。我将有一个用于重置数据库并预先填充初始数据的脚本。我发现最好对真实的东西进行测试,而不是一些模仿事物的模型。

    这段代码来自不同地方的点点滴滴+我自己的一些创造力......

    当应用程序已启动并运行时,您能否看到任何可能导致痛苦的事情?扔在我的脸上! ;)

    谢谢! :)

1 个答案:

答案 0 :(得分:3)

Context应该是短暂的 - 你的代码似乎暗示你的Context将有很长的生命周期并被共享。这会让你感到悲伤。