我沒能拿出來重置全局的DbContext的方法。然而,我可以通過將DbContextLocator
注入任何需要DbContext而不是傳遞DbContext本身的類來解決我的問題。
我的目標是維護全局的DbContext,但允許在需要時重置它(例如在數據庫重建或導入之後)。
我的解決方案使用抽象基類和具體類。
基類
using System.Data.Entity;
namespace CommonLibrary.Database
{
public abstract class DbContextLocator
{
private DbContext _dbContext;
public DbContext Current
{
get { return _dbContext; }
}
public DbContextLocator()
{
_dbContext = GetNew();
}
public virtual void Reset()
{
_dbContext.Dispose();
_dbContext = GetNew();
}
protected abstract DbContext GetNew();
}
}
具體類
using System.Data.Entity;
using CommonLibrary.Database;
using ExperimentBase.EntityModels;
namespace MainProject.Models
{
public class MainDbContextLocator : DbContextLocator
{
public new MainDbContext Current
{
get { return (MainDbContext)base.Current; }
}
protected override DbContext GetNew()
{
return new MainDbContext();
}
}
}
用法
獲取當前的DbContext:
var dbContext = dbContextLocator.Current;
重置的DbContext:
dbContextLocator.Reset();
//Note: normally followed by code that re-initializes app data
編輯
基於擺振的反饋,我做了DbContextLocatorBase
爲通用。 (我現在也實現IDisposable
)
基類
public class DbContextLocator<TContext> : IDisposable
where TContext : DbContext, new()
{
private TContext _dbContext;
public TContext Current
{
get { return _dbContext; }
}
public DbContextLocator()
{
_dbContext = GetNew();
}
public virtual void Reset()
{
_dbContext.Dispose();
_dbContext = GetNew();
}
protected virtual TContext GetNew()
{
return new TContext();
}
public void Dispose()
{
_dbContext.Dispose();
}
}
具體類(可選的,因爲基類不再是抽象的)
public class MainDbContextLocator : DbContextLocator<MainDbContext> { }
我想說'DbContextLocator'是一個泛型類,即'DbContextLocator where TContext:DbContext',那麼你不必做派生類,或者你可以讓派生類只是爲了減少冗長而不聲明任何東西它,見示例[這裏](http://pastebin.com/KRqQvAie) –
Shimmy
2012-05-03 22:06:51
好主意......我想我從來沒有優化到這一點,因爲我只傾向於寫每個項目的具體類之一。 – devuxer 2012-05-03 22:28:18
一旦你習慣了泛型,這不是一個優化,這是默認的代碼設計:) – Shimmy 2012-05-03 22:55:57