2015-11-04 71 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