使用参数重写包装ioc解析

本文关键字:ioc 解析 包装 重写 参数 | 更新日期: 2023-09-27 18:29:08

所以,我正在考虑一个问题,需要一些帮助。首先,我使用Unity for IOC,并希望使用它来解析和生成SQL调用的包装器实例。为此,我有一个实现ISqlWrapper的SqlWrapper。它有两个构造器。这是相关的代码片段。

public interface ISqlWrapper : IDisposable
{
    string CommandText { get; set; }
    void Execute();
}
public class SqlWrapper : ISqlWrapper, IDisposable
{
    public SqlWrapper(string connectionString);
    public SqlWrapper(IDbConnection sqlConnection);
    string CommandText { get; set; }
    void Execute();
}

显然,about并不是完整的代码,它是为了说明实现的相关部分。

对于我的应用程序,我只使用带有connectionString的构造函数。所以,在我的IoC容器中,我注册了以下。。。

_unityContainerontainer.RegisterType<ISqlWrapper, SqlWrapper>( new InjectionConstructor(typeof(string)));

现在,这就是事情变得有趣的地方。我想做的是实现一个方法,使我能够轻松地解析ISqlWrapper的实例。我已经将代码分解为这个方法。

ISqlWrapper CreateSqlWrapper(string connectionString)
{
    ParameterOverrides parameterOverride = new ParameterOverrides();
    parameterOverride.Add("connectionString", connectionString);
    return _iocContainer.Resolve<ISqlWrapper>(parameterOverride);
}

然而,目前我正在将此方法的副本放入用于连接数据库的每个类中。

public class ExampleClass1 : IExampleClass1
{
    private readonly IIocContainer _iocContainer;
    ISqlWrapper CreateSqlWrapper(string connectionString)
    {
        ParameterOverrides parameterOverride = new ParameterOverrides();
        parameterOverride.Add("connectionString", connectionString);
        return _iocContainer.Resolve<ISqlWrapper>(parameterOverride);
    }
    public ExampleClass1(IIocContainer iocContainer)
    {
        _iocContainer = iocContainer;
    }
    public void DoStuff(string connectionString)
    {
        using( ISqlWrapper sqlWrapper = CreateSqlWrapper(connectionString))
        {
            CommandText = "Select * from Table*";
            Execute;
        }
    }
}

因此,问题是我需要在每个类中都有一个CreateSqlWrapper实例,以使实现ISqlWrapper的实例更容易。我知道我可以使用继承将这个方法实现到父类中。然而,我正在尝试看看是否有更好的解决方案来解决这个问题。

有人知道我如何定义CreateSqlWrapper方法而不需要将其复制并粘贴到每个类中吗?

使用参数重写包装ioc解析

看看这个答案:如何使用静态工厂方法创建对象?

您可以使用InjectionFactory并在配置期间传递委托。

我已经阅读了每个人的意见,并认为Gian Paolo发布了最好的建议。基本上我需要建立一个工厂。以下是我所做的。

Gian Paolo如果你发布答案,我会根据你的评论接受。

为工厂方法创建了一个接口和类。

public interface ISqlWrapperFactory
{
    ISqlWrapper CreateInstance(string connectionString);
}

公共类SqlWrapperFactory:ISqlWrapperFactory{private只读IIocContainer_iocContainer;

    public SqlWrapperFactory(IIocContainer iocContainer)
    {
        _iocContainer = iocContainer;
    }
    public ISqlWrapper CreateInstance(string connectionString)
    {
        ParameterOverrides parameterOverride = new ParameterOverrides();
        parameterOverride.Add("connectionString", connectionString);
        return _iocContainer.Resolve<ISqlWrapper>(parameterOverride);
    }
}

已将其注册到IoC容器中。

_unityContainerontainer.RegisterType<ISqlWrapperFactory, SqlWrapperFactory>();

然后修改类如下。

public class ExampleClass1 : IExampleClass1
{
    private readonly IIocContainer _iocContainer;
    private readonly ISqlWrapperFactory _sqlWrapperFactory;

    public ExampleClass1(IIocContainer iocContainer, ISqlWrapperFactory sqlWrapperFactory)
    {
        _iocContainer = iocContainer;
        _sqlWrapperFactory = sqlWrapperFactory;
    }
    public void DoStuff(string connectionString)
    {
        using( ISqlWrapper sqlWrapper = _sqlWrapperFactory.CreateInstance(connectionString))
        {
            CommandText = "Select * from Table*";
            Execute();
        }
    }
}

这意味着工厂方法只需要声明一个-yay表示干燥:)此外,实现ISqlWrapper的代码仍然是一个单行代码。这意味着有人捣乱的可能性更小。

我想我会完整地发布这篇文章,让其他人看到这个问题的解决方案。基本上,将参数传递给构造器是它与其他解决方案不同的地方。