簡體   English   中英

我應該處置非擁有的實例嗎?

[英]Should I Dispose instances that are not Owned?

我在一個項目中使用Autofac,但我嘗試做正確的事情。 因此,我一直在閱讀文檔並找到Owned<T> 當我想自己處理某些事情時,似乎這是使用的正確關系類型,例如,一次性DbContext

因此,我將所有注入的工廠Func<DbContext>更改為Func<Owned<DbContext>>

唯一的事情是感覺像Lazy<T>這樣的行為有點骯臟,並根據非框架類型將Owned放在使用中...

完全不使用Owned是錯誤的嗎?

這樣處理我的班級不擁有的實例時是否存在問題?

public class MyClass
{
    private readonly Func<DbContext> _dbcFactory;

    private MyClass(Func<DbContext> dbcFactory)
    {
        _dbcFactory = dbcFactory; // nullcheck etc;
    }
    private void TheMethodWhoUpdate(String newName) 
    {
        using(var dbc  = _dbcFactory())
        {
            var ent = dbc.Table.Single(x => x.id == 3);

            end.Name = newName;
            dbc.SaveChanges();
        }
    }
}

我能想象到的(因為我在文檔上找不到線索)可能會導致一些性能問題,因為也許autofac會跟蹤創建的DbContext實例並嘗試再次對其進行處理,從而浪費了一些時間(可能很小)...但是也許我錯了,我應該堅持使用指南

為什么不只使用代碼示例中所示的Func<DbContext> dbcFactory

您不應該這樣做,有兩個原因。

  1. 處置它是容器的工作-因此,讓它完成它的工作。
  2. 其次,如果將DbContext注冊為InstancePerLifetimeScope則多個對象(包含在同一生存期范圍內)將獲得DbContext相同實例-如果其中一個對象將其從另一個對象中移出,則是有問題的。

當僅擁有一個dbcontext實例(或僅有其他任何類)時,這不是一個選擇(有很多原因我不在這里討論),創建新實例是完全可以的。

在堅持依賴注入模式的同時,獲得工廠注入而不只是一個實例是獲得它的方法。

關於Func<Owned<T>>Func<T>我剛剛發現讓示波器執行其工作的艱難方法,這是一個壞主意。

我使用了Func<Owned<T>>方法,但是即使我處置了所有擁有的作用域,我最終也會遇到巨大的內存泄漏。

對我而言真正有效的方法是注入一個創建dbContext的工廠(或僅在有限的時間內需要執行任何操作,或者需要控制生命周期的任何方法)。

該工廠應注冊為一個實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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