簡體   English   中英

DI與一次性物品

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM