c# - 带 IoC 的工厂隔离模式

标签 c# asp.net .net

据我了解,仅当目标接口(interface)未实现 IDisposable 时才需要工厂隔离模式。

  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
        })
    }
    

最佳答案

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/

相关文章:

asp.net - 如何从用户控件内部获取 aspx 页面的类名?

c# - 如何检查 ObservableCollection 中的重复项?

c# - SQL Server 连接字符串

asp.net - Code First 启用迁移

c# - 成员 'MySql.Data.MySqlClient.MySqlException,MySql.Data, Version=6.8.8.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d' 的类型未解析

c# - 如何获取一个类扩展的所有类的 Type[]

c# - 使用c#获取onload隐藏字段值

c# - 将日志文件转换为 XML 和(XHTML,建议

.net - 被国际奥委会的选择淹没

c# - 在 C# 中为 Xamarin 禁用泛型