c# - 使用参数覆盖包装 ioc resolve

标签 c# unity-container dry

所以,这是一个我正在考虑并需要一些帮助的问题。首先,我将 Unity 用于 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 方法而不需要将其复制并粘贴到每个类中?

最佳答案

查看此答案:How to create objects using a static factory method?

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

关于c# - 使用参数覆盖包装 ioc resolve,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34621127/

相关文章:

ruby-on-rails - 什么时候停止 DRYing 代码?

ruby - RSpec 中的 DRY 双倍

c# - IPN模拟器错误

c# - 如果在 Android 中安装了特定的应用程序,我如何从 Xamarin 中找出?

asp.net-mvc-3 - Mvc 3/Unity 2 将依赖项注入(inject)过滤器?

unity-container - Unity 将两个接口(interface)注册为一个单例

c# - 属性中的依赖注入(inject)

javascript - 优化 React 代码

c# - 如何获取应用程序的安装路径?

c# - 尝试以编程方式打开 PowerPoint 时出错