据我了解,仅当目标接口(interface)未实现 IDisposable 时才需要工厂隔离模式。
因此对于下面的代码,这是不正确的用法,因为 IDbConnection 确实实现了 IDisposable。这是正确的吗?
假设 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 }) }
最佳答案
FactoryIsolationPattern 在“Adaptive Code Via C#”中引入。您的客户端代码类似于用于解释此模式用法的代码。正如作者所解释的那样,这些模式的目的是,不要让 Disposing 逻辑的类负担过重。相反,构造用于确定对象的生命周期并在其中提供处理单元。
因此,如果您实现了 IDisposable,它应该不会影响。这就像您使用的是独立工厂而不是上下文 block 。
我只看到这段代码有问题:
public void With(Action<IDbConnection> do){
using (var connecion = CreateConnection()){
do(connection);
}
}
提供该模式是为了为非一次性接口(interface)添加处理逻辑。但是你已经在 CreateConnection()
上放置了一个 using 意味着这个工厂方法应该返回一个实现了 IDisposable
的对象。这与此模式的目的背道而驰。
关于c# - 带 IoC 的工厂隔离模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33532817/