使用参数重写包装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方法而不需要将其复制并粘贴到每个类中吗?
看看这个答案:如何使用静态工厂方法创建对象?
您可以使用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的代码仍然是一个单行代码。这意味着有人捣乱的可能性更小。
我想我会完整地发布这篇文章,让其他人看到这个问题的解决方案。基本上,将参数传递给构造器是它与其他解决方案不同的地方。