2015-11-04 84 views
1

根據我的理解,當目標接口不實現IDisposable時,只需要工廠隔離模式。帶IoC的工廠隔離模式

  1. 因此,對於低於這個代碼是不正確的使用,因爲它的IDbConnection實現IDisposable。它是否正確?

  2. 假設IDbConnection沒有實現IDisposable,那麼該用法是正確的。一旦Lambda表達式完成,IDbConnection將被丟棄。正確?

    public class IsolationConnectionFactory : IConnectionIsolationFactory { 
        public void With(Action<IDbConnection> do){ 
         using (var connecion = CreateConnection()){ 
          do(connection); 
         } 
        } 
    } 
    
    // IConnectionIsolationFactory injected by IoC in this class 
    public IEnumerable<TaskDto> GetAllTasks(){ 
        // Usage 
        connectionFactory.With(connection => { 
         connection.Open(); 
         // get data/while read etc 
        }) 
    } 
    
+0

我剛剛在「適應代碼通過C#」中遇到了這一節,並且有同樣的問題。我沒有得到的是,由於工廠返回的接口不會擴展'IDisposable','using'塊不能識別'IDisposable',因爲它在類中。我爲自己創建了一個例子,它不能編譯。 – Robotron

回答

1

因此,對於低於這個代碼是不正確的使用,因爲它的IDbConnection實現IDisposable。它是否正確?

我不會說「不正確的用法」。我會說在這種情況下可能不需要。

但是,有時候,即使工廠的產品實現了IDisposable,也可能需要使用隔離工廠。您可能需要確保消費者不會忘記處理該產品。或者您可能還有其他一些定稿/發行代碼,除了撥打IDisposable.Dispose

假設IDbConnection沒有實現IDisposable,那麼該用法是正確的。一旦Lambda表達式完成,IDbConnection將被丟棄。正確?

是。

在這種情況下,雖然IDbConnection沒有實現IDisposableCreateConnection返回類型必須因爲在你的代碼,你正在使用的語法using實施IDisposable

3

FactoryIsolationPattern在「Adaptive Code Via C#」中引入。您的客戶端代碼與用於解釋此模式使用的代碼類似。作者解釋的模式意圖並非爲了使用處置邏輯對類進行負擔過重。而是使用構造來限定對象的壽命並在其中提供處理單元。

所以它不應該影響,如果你有IDisposable實施。這就像是使用隔離工廠而不是上下文阻止。

我只看到問題的代碼塊:

public void With(Action<IDbConnection> do){ 
    using (var connecion = CreateConnection()){ 
     do(connection); 
    } 
} 

方式提供圖案添加設置邏輯,其用於非一次性接口。但是你已經使用了超過CreateConnection()的意思,這個工廠方法應該返回一個實現了IDisposable的對象。這違背了這種模式的目的。

+0

因此,不是使用block來封裝動作代碼,而是暗示使用try ... finally代碼塊。在你測試的「最後」部分,如果注入類型是一次性的,並且如果它是可以處置的話。 – RollingStone