2013-09-23 46 views
0

谷歌搜索一段时间后,我想知道哪些是DBContext(EntityFramework或Linq-to-Sql)的最佳实践。ASP DBContext最佳实践

在实践中我会骗知道下面“模式”一个有少缺点:

1)获取代码从Here

public class ContextFactory 
{ 
    [ThreadStatic] 
    private static DBDataContext context; 
    //Get connectionString from web.config 
    private static readonly string connString = ConfigurationManager.ConnectionStrings["ConnectionString1"].ConnectionString; 

    public static DBDataContext Context() 
    { 
     if (context == null) 
      context = new DBDataContext(connString); 
     return context; 
    } 

    public static void FlushContext() 
    { 
     context = new DBSkillDataContext(connString); 
    } 
} 

这样我使用FlushContext每次控制器是初始化。

2)这样(从Here获取代码)

public class UnitOfWork : IUnitOfWork, IDisposable 
    { 
    DBContext context= null; 
    IUserRepository userRepo = null; 
    IAccountRepository accountRepo = null; 

    public UnitOfWork() 
    { 
     context= new DBContext(); 
     userRepo= new UserRepository(context); 
     accountRepo= new accountRepo(context); 
    } 

    public IUserRepository userRepo 
    { 
     get 
     { 
      return userRepo; 
     } 
    } 

    public IAccountRepository accountRepo 
    { 
     get 
     { 
      return accountRepo; 
     } 
    } 

    public void Dispose() 
    { 
     // If this function is being called the user wants to release the 
     // resources. lets call the Dispose which will do this for us. 
     Dispose(true); 

     // Now since we have done the cleanup already there is nothing left 
     // for the Finalizer to do. So lets tell the GC not to call it later. 
     GC.SuppressFinalize(this); 
    } 

    protected virtual void Dispose(bool disposing) 
    { 
     if (disposing == true) 
     { 
      //someone want the deterministic release of all resources 
      //Let us release all the managed resources 
      context= null; 
     } 
    } 

    ~UnitOfWork() 
    { 
     // The object went out of scope and finalized is called 
     // Lets call dispose in to release unmanaged resources 
     // the managed resources will anyways be released when GC 
     // runs the next time. 
     Dispose(false); 
    } 
} 

public abstract class AController : Controller 
{ 
    private IUnitOfWork IUnitOfWork; 

    protected IUnitOfWork UnitOfWork_ 
    { 
     get { return IUnitOfWork; } 
    } 

    public AController(IUnitOfWork uow) 
    { 
     this.IUnitOfWork = uow; 
    } 
} 

public class UserController : AController 
{ 
    // use our DbContext unit of work in case the page runs 
    public UserController() 
     : this(new UnitOfWork()) 
    { 

    } 

    // We will directly call this from the test projects 
    public UserController(UnitOfWork unitOfWork) 
     : base (unitOfWork) 
    { 

    } 

    public ActionResult Index() 
    { 
     List<User> users= UnitOfWork_.usersRepo.GetUsers(); 

     return View(users); 
    } 

}

所以我要问的是,它的上面一种是使用最好的做法?

回答

0

不要使DbContext静态。 DbContext不是线程安全的并且使其变得静态,这使得它易于在多个线程中使用 - 特别是在我们可能导致难以调试/解决错误甚至数据损坏的场景中。此外,保持上下文长时间运行并不是一个好主意 - 它会跟踪越来越多的实体,因此会逐渐变慢和变慢。它还会阻止GC收集正在跟踪但未被使用的对象。 另一个例子好多了。 DbContext本身就是一种UnitOfWork。我不确定我是否会从这里开始使用Reposiory模式。我宁愿直接使用DbContext,并在从我的代码中出现时才转向使用模式,并且只有在使用模式有益时(请注意,模式需要更多需要理解和维护的代码)。