2016-09-14 45 views
0

我最近啓動了一個小型項目(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容器中?這是我應該試圖做的事嗎?

+2

爲什麼'Log'需要一個接口'ILog'? Log不是一個簡單的DTO嗎?你能想到一個場景,你需要一個不同的'ILog'實現嗎? –

+0

爲什麼要創建多個Log實例?不應該使用Singleton? – Rohit

+0

雅各布馬薩德 - 我知道有人會指出。答案可能是?我們的數據庫正在經歷一些重大變化。我已經知道如何將自己映射到幾個不同的表,但這些表可能會改變。 –

回答

-1

一般來說 - 你不應該在這裏需要一個DI。 DI並不意味着你根本不能使用'新'操作符。是的,你可以和域的類是非常好的例子,你會使用它。

但如果你想在登錄實例抽象創作一些複雜的情況下,您可以隨時使用工廠模式:

public interface ILogFactory 
{ 
    ILog Create(); 
} 

public class DefaultLogFactory : ILogFactory 
{ 
    public ILog Create() 
    { 
     return new Log(); 
    } 
} 

這家工廠現在注射和更換。但就像我說的,你可能不需要或不需要那樣。

+0

在我的問題我確實說過我考慮過工廠模式,但是避免了它,因爲它只是簡單地解決了問題。現在你的工廠正在創建新的實例,而不是原來的類。重點是什麼? –

+0

您可以在配置中輕鬆交換工廠。但正如我所說 - 你可能根本就不需要任何抽象! –

相關問題