我與實現IDisposable第三方對象的工作。爲了使單元測試「能夠」,我構建了一個包裝器。我知道該對象實現IDisposable我的包裝需要實現IDisposable以及。實施和使用IDisposable的
public interface IWrapper : IDisposable
{
void Complete();
}
public class Wrapper : IWrapper
{
private readonly ThirdPartyLib lib;
public Wrapper()
{
lib = new ThirdPartyLib();
}
public void Complete()
{
lib.Comlete();
}
public void Dispose()
{
lib.Dispose();
}
}
public class Processor : IProcessor
{
private readonly IWrapper wrapper;
public Processor(IWrapper wrapper)
{
this.wrapper = wrapper;
}
public void Process()
{
// do some work
using (wrapper) {
// do more work
}
}
}
假設處理器在某些類,它是用它和工藝注入()被執行
- 什麼happends爲包裝,如果我們呼叫處理()再一次? - ThirdPartyLib()不會拋出一個異常,因爲它只被創建一次(在包裝器的構造函數中),現在它已經被處置了
- 只要有引用它就不會被拋棄嗎?
- 如果包裝也許可以建立這樣一種方式,新的()可以在構造函數,但在一個單獨的方法不執行ThirdPartyLib的「ing」的,說開始() - 像這樣:
public class Wrapper : IWrapper { private ThirdPartyLib lib; public void Begin() { lib = new ThirdPartyLib(); } public void Complete() { lib.Comlete(); } public void Dispose() { lib.Dispose(); } }
然後使用它:
using (wrapper.Begin()) {
我覺得我們沒有這個大圖。爲什麼'Processor'只處理一個被注入到構造函數中的'Wrapper'?通常我會希望你'Processor'有一個方法調用,比如'Process(IWrapper wrapper)',允許你處理這個包裝器,但是我會再次進入陣營,這將是調用者必須致電'處置'在'IWrapper'上,因爲它實際上擁有它。如果情況並非如此,那麼我可能會在'IProcessor'上實現'IDisposable',並且在處理時只處理'IWrapper'。 –
僅在IP處理器上實現IDisposable時,處理IP處理器時(在當前設計中),而不是在使用語句的「}」命中時處理包裝器?這是因爲(父)IP處理器持有對IWrapper的引用 - 即使我們告訴它將被放置在「}」 – BobSwanson
這就是爲什麼用DI初始化的對象應該假設它們擁有注入的object_。大多數時候,他們是由其他對象使用的單身人士,或者至少是別的東西正在控制生命。依賴於DI的對象只應該使用該對象,並假定該對象創建的任何內容都將負責在稍後對其進行覈對。 DI就像_「嘿,我只想要一個對象,別人可以爲我創建和刪除它」_ – MickyD