我最近啓動了一個小型項目(C#.Net控制檯應用程序),並試圖將Castle Windsor作爲我的DI容器正確使用依賴注入。通過ORM將新記錄添加到數據庫時應該如何使用依賴注入? C#
因爲我已經進行了一段時間的單元測試,所以對於依賴注入我不是什麼新東西。我覺得我一直在行,但遇到了一個場景,我覺得我必須實例化一個遠離組合根的對象。
在我的數據訪問層,我使用實體框架(6)從我的數據庫中獲取數據。這全部隱藏在我的域邏輯層中定義的接口後面。
我需要添加一個新的日誌記錄,這裏是我的代碼的刪節和編輯版本;
public class Logger:ILogger
{
private readonly IContext _context;
public Logger(IContext context)
{
_context = context;
}
public void Write(string message)
{
var log = new Log();
log.Message = message;
context.Logs.Add(Log);
context.Save();
}
}
Log實現了ILog接口;
public interface ILog
{
string Message { get; set; }
}
這是我過去使用過的解決方案,因爲可以對這段代碼進行單元測試,但我不再注入所有的依賴關係。
我已經考慮過方法注入(即傳遞一個ILog與消息),但是消耗此代碼的類從哪裏得到它的實例呢?如果我要注入一個工廠,同樣的問題也是如此,它會從這個類中解決問題並將其移至另一個類。
我懷疑解決方案(如果需要的話)在於我如何設置ILog實例的對象生存期。
在我真正的實現中,我有一個Controller類,需要一個ILogger的實例。我可以用我的DI容器註冊Controller,ILogger和IContext的具體實現,我可以解析Controller的一個實例並運行該應用程序,但在運行時我需要未知數量的Log實例。
如何將創建的Log實例推回到我的DI容器中?這是我應該試圖做的事嗎?
爲什麼'Log'需要一個接口'ILog'? Log不是一個簡單的DTO嗎?你能想到一個場景,你需要一個不同的'ILog'實現嗎? –
爲什麼要創建多個Log實例?不應該使用Singleton? – Rohit
雅各布馬薩德 - 我知道有人會指出。答案可能是?我們的數據庫正在經歷一些重大變化。我已經知道如何將自己映射到幾個不同的表,但這些表可能會改變。 –