[英]DI with disposable objects
假設我的存儲庫類如下所示:
class myRepository : IDisposable{
private DataContext _context;
public myRepository(DataContext context){
_context = context;
}
public void Dispose(){
// to do: implement dispose of DataContext
}
}
現在,我正在使用Unity來控制存儲庫和數據上下文的生存期,並將生存期配置為:
DataContext
單例
myRepository
每次創建一個新實例
這是否意味着我不應該在存儲庫上實現IDisposable來清理DataContext?
有關這些項目的任何指導?
編輯: DataContext
單例-將其作為每個Web請求的單例讀取
通常, 抽象依賴項不應從IDisposable派生 ,因為它將是Leaky Abstraction 。 依賴項可能取決於也可能不持有非托管資源, 具體取決於具體實現。 在任何情況下, 容器都應該管理生存期 ,因此,它不是由使用者來決定的-它不了解依賴項的生命期:它可以與其他使用者共享,在這種情況下,過早處置將具有破壞性它的。
就是說,(LINQ to SQL?)DataContext代表了一個不同的問題,因為它已經實現了IDisposable,並且由於它是在BCL中定義的,因此您不能很好地更改它。
您可以為存儲庫正確實現IDisposable,但這意味着您必須匹配所有存儲庫和數據上下文的生存期 。
另一種選擇是簡單地忽略您持有的是一次性資源,但是如果這樣做,則必須絕對確保 Unity在適當的時候正確處置了DataContext-但由於您計划使用Singleton一生,這應該不是問題。
如果您是我,那么我將改為執行UnitOfWork模式實現,或者讓IOC容器管理DataContext的生存期。
例如,Structuremap具有HttpContextScoped選項,因此您可以像這樣注冊DataContext:
For<DataContext>().HttpContextScoped().Use<MyDataContext>();
這是否意味着我不應該在存儲庫上實現IDisposable來清理DataContext?
聽起來很像-按照您的意思,所有存儲庫將共享相同的DataContext
,但是您創建的第一個存儲庫將對其進行處理。
是什么創建DataContext
? 不管是什么,它都應該處理掉。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.