代码之家  ›  专栏  ›  技术社区  ›  Hakan Fıstık MuriloKunze

如何在使用ContextDB类完成任何查询后自动处理它

  •  0
  • Hakan Fıstık MuriloKunze  · 技术社区  · 6 年前

    ASP.NETMVC5项目。

    我知道使用EF context对象的最佳实践如下

    using(var context = new ContextDB())
    {
    }
    

    但我正在处理一个现有的大型项目,它没有使用这种做法。
    该项目使用以下模式

    public abstract class BaseService
    {
        private static ContextDB _data { get; set; }
        public static ContextDB Data
        {
            get
            {
                if (_data== null)
                    _data= new ContextDB();
    
                return _data;
            }
        }
    }
    

    事实上,因为这个模式,我收到了这个 exception (有时,不总是)

    Data 属性,并将其替换为的新实例 ContextDB 正如我在问题的开头提到的。

    问题是,这是一个非常大的修改,我不会被允许做修改。

    问题是,我能在不改变一大堆代码的情况下解决这个问题吗?换句话说,我能通过只在 BaseService 例如,是否有任何事件我可以处理以知道是否执行了任何查询,然后处理ContextDB

    public abstract class BaseService
    {
    
        public static ContextDB Data
        {
            get
            {
                ContextDB _data= new ContextDB();
                _data.SqlQueryExecuted += () => { this._data.dispose(); }
                return _data;
            }
        }
    }  
    

    注:以下为 SaveChanged

    1 回复  |  直到 6 年前
        1
  •  0
  •   dotnetstep    6 年前

    我可以用下列方法。

    1. 在全球.asax 开始请求:创建dbContext的实例。储存在HttpContext.Current.Items.

      结束请求:获取上下文并关闭/释放连接。

    2. 另一个更好的解决方案是使用DI。依赖注入并限制实例的范围。有很多种方式,如单件,佩雷克斯特等。