我認爲,如果沒有完整的體系結構更改,這可能是不可能的,但我有在運行時爲用戶公開可配置選項的類(插件)。在類實例化後的運行時使用依賴注入
該程序啓動時,用戶可以選擇使用各種插件,用戶面臨的選項,他們可以修改爲每個插件,用戶按下播放按鈕,這些配置選項讀取和關閉我們去。
當用戶選擇要使用的插件時,將創建該類的實例,以便它可以顯示該插件的可用選項。顯然,在正常情況下,當類實例化時,構造函數參數被傳入。在這種情況下,如果插件具有ILogger的構造函數參數,並且其具體類具有DirectoryPath的構造函數參數,但只有在用戶單擊播放後纔可讀取,我怎樣才能獲得我的國際奧委會容器通過它?
public class MyPlugin
{
private ILogger Logger;
private Dictionary<string, object> Properties = new Dictionary<string, object>();
public MyPlugin(ILogger Logger)
{
this.Logger = Logger;
SetupProperties();
}
private SetupProperties()
{
Properties.Add("LogDirectory","Please enter a directory");
}
private void UserPressedPlay()
{
//We can now read the property values user has entered
//Now I want to instantiate FileLogger with the LogDirectory property
}
public DoSomething(string Data)
{
this.Logger.Write(Data);
}
}
public interface ILogger
{
void Write(string Data);
}
public FileLogger : ILogger
{
private string DirectoryPath;
public FileLogger(string Directory)
{
this.DirectoryPath = Directory;
}
public Write(string Data)
{
//Write to file
}
}
我目前不使用IOC容器,因此我不會將其作爲答案發布,但我認爲您想要做的是傳入ILogger工廠而不是實際的ILogger。然後可以使用用戶的參數從UsrePressedPlay調用工廠以創建實際的Logger實例。 – 2012-03-22 21:01:14
在不改變當前體系結構的情況下,我會在IoC中設置默認構造器設置 - 將設置目錄設置爲AppData \ Local \ Temp文件夾,然後在用戶單擊播放後重新初始化Logger界面。 雖然這是相當討厭的事情,並通過記錄器工廠提及500 - 內部服務器錯誤是一個好主意。 – 2012-03-22 21:14:46
@ 500-InternalServerError所以你主張在這種情況下不使用IOC? – Jon 2012-03-22 21:18:20