【发布时间】:2015-06-29 14:53:05
【问题描述】:
我正在尝试找出将参数传递给自动解析参数的子对象的构造函数的最佳(最好)方法。
为什么? 因为我有一个程序可以针对同一个“生产”数据库(在配置文件中定义,所以不需要参数)进行几乎所有的计算。但是现在需要在这个数据库的“副本”上运行一些工作。因此需要不同的连接字符串。
连接字符串可以在构造函数中提供,并且在编译时是未知的。问题是我不能(或不知道如何)简单地访问这个构造函数,因为它深埋在生成的项目中。
考虑以下(简化的)代码 sn-p:
public class Example
{
protected readonly IGenerateSomethingFactory Factory;
public Example(IGenerateSomethingFactory factory)
{
Factory = factory;
}
public Task DoSomething(string ConnectionString, string a, string b)
{
//needs to run somehow using the supplied connection string ...
return Task.Run(() => Factory.CreateSomething().Execute(a, b));
//= Task.Run(() => new Something(new UnitOfWork(new DataContext(ConnectionString))).Execute(a, b));
}
public Task DoSomething(string a, string b)
{
//needs to run using the default connection string (defined in config)
return Task.Run(() => Factory.CreateSomething().Execute(a, b));
}
}
问题在于第一个DoSomething(...)函数。
注意:Castle Windsor 安装程序如下所示:
public class Installer : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.AddFacility<TypedFactoryFacility>();
container.Register(Component.For<IGenerateSomethingFactory>().AsFactory());
container.Register(Classes.FromThisAssembly().InNamespace("x").WithService.FirstInterface());
}
}
我正在寻找一种解决方案:
- 是线程安全的
- 很容易理解(如果不容易想到)
- 允许重构(因此没有像 "conString" 这样的命名参数)
- 不需要更改其他不相关的代码 (即设置属性 public ...)
- 不调用
new或container.Resolve<>()
我一直在研究选择处理程序,但还没有真正找到我想要的。
PS:我使用的是温莎城堡 3.3.0
PPS:这是我的第一个问题,我可以提供更多示例代码,但我认为我应该限制在最低限度......所以如果我需要这样做,请告诉我。
【问题讨论】:
-
看来您可以将
ConnectionString作为参数添加到您工厂的CreateSomething方法中。还是我误解了你的问题? -
好吧,我没有创建工厂,它是由温莎城堡自动生成的。此外,我可能需要在容器上调用 Resolve
并确保我正确地完成了所有清理工作。而且我是 DI 的新手…… -
对,但是你定义了接口。从 wiki 阅读 this section 和 this section。
-
你有没有想过如何将这些构造函数参数沿链传递?这似乎是一个非常明显的问题,我找不到解决方案。
-
@DanQ:不,我们最终修改了服务以允许在创建后设置参数。不是最优的,因为我们不希望在第一次使用后改变它。
标签: c# dependency-injection castle-windsor