我試圖找出將參數傳遞給構造函數的最佳(最好)方法自動解析參數的子對象。Castle Windsor:如何將參數傳遞給待解析類型的「子」項的構造函數
爲什麼? 因爲我有一個程序幾乎可以完成對同一個「生產」數據庫的所有計算(在配置文件中定義,因此不需要參數)。但現在需要在這個數據庫的「副本」上運行一些工作。因此需要不同的連接字符串。
連接字符串可以在構造函數中提供,並且在編譯時不知道。問題是我不能(或不知道如何)簡單地訪問這個構造函數,因爲它深埋在生成的項目中。
考慮以下(簡化的)的代碼片斷:
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(...)
函數規定。
注:溫莎城堡的安裝程序是這樣的:
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」)
- 不會r等於改變其他不相關的代碼 (即,設置屬性的公共...)
- 不叫
new
或container.Resolve<>()
我一直在尋找到選擇處理程序,但還沒有真正找到了我一直在尋找。
PS:我使用溫莎城堡3.3.0
PPS:這是我的第一個問題,我可以提供更多的示例代碼,但我認爲應該限制到最小......所以讓我知道如果我需要這樣做。
看來你可以在工廠的'CreateSomething'方法中添加'ConnectionString'作爲參數。或者我誤解了你的問題? –
那麼我沒有創建工廠,它是由溫莎城堡自動生成的。另外,那麼我可能需要在容器上調用Resolve,並確保我正確地執行所有清理。我是DI新手...... –
對,但你定義了界面。閱讀[本節](https://github.com/castleproject/Windsor/blob/master/docs/typed-factory-facility-interface-based.md#resolving-with-arguments)和[本節](https: //github.com/castleproject/Windsor/blob/master/docs/typed-factory-facility-interface-based.md#method-parameters-are-forwarded-to-the-caller-by-name)。 –