如何保證對象線程內唯一:數據槽(CallContext)


CallContext 是類似於方法調用的線程本地存儲區的專用集合對象,並提供對每個邏輯執行線程都唯一的數據槽。數據槽不在其他邏輯線程上的調用上下文之間共享。當 CallContext 沿執行代碼路徑往返傳播並且由該路徑中的各個對象檢查時,可將對象添加到其中。

public class DbContextFactory
    {
        public static DbContext CreateDbContext()
        {
            DbContext dbContext = (DbContext)CallContext.GetData("dbContext");
            if(dbContext == null)
            {
                dbContext = new RolePermissionEntities();
                CallContext.SetData("dbContext",dbContext);
            }
            return dbContext;
        }
    }

不能每次使用EF上下文都通過new來創建對象,因為在不同層中使用EF上下文時就不在是同一個上下文對象了。我們可能會考慮使用單例模式,但是不能通過單例模式來解決EF上下文對象的問題,因為如果使用單例模式,那么大家都共用一個EF上下文對象一直不能釋放,一旦釋放,其他正在使用的用戶用不了了。可以考慮一次請求中使用一個EF上下文對象。這樣既不影響其他用戶的操作,也減少了數據庫連接,即線程內唯一對象,因為一個請求就是一個線程。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM