2012-03-22 97 views
0

可以說我有一個類將一個IFileLogger作爲構造函數參數。在類相關性上分配屬性

public MyClass : IClass 
{ 
    private IFileLogger Logger; 
    public MyClass(IFileLogger Logger) 
    { 
     this.Logger = Logger; 
    } 
} 

某處在該類調用Logger.Write("Data");

IFileLogger具有目錄路徑的屬性;

這需要設置,以便IFileLogger知道在哪裏寫文件。

這是如何設置的?

我的想法是獲得設置的類的屬性,然後在構造函數中有類似IFileLogger.DirectoryPath = this.DirectoryPath。

這似乎是錯誤的,因爲IClass需要擁有它的屬性,並且最終創建一個只在底層需要的屬性鏈。

你能幫助那些看不到樹木的人嗎?你也會寫測試和如何,以確定IFileLogger的DirectoryPath填充?

回答

0

我可以建議你的界面設計是這裏的問題和你的問題是臭味的跡象?

IFileLogger表示您的類所依賴的接口。因此,看看界面,我們看到有一個Write方法。事情是,MyClass並不在乎如何記錄發生,只是它符合接口。據說,MyClass需要知道目錄位置以便告訴IFileLogger如何執行它的工作的想法告訴你,責任是錯位的。

代碼需要什麼IFileLogger?記錄,對吧?讓我們稍微重構代碼並實現接口以滿足客戶端的需求MyClass。他不在意如何記錄發生,只是它發生。

改爲將接口重命名爲​​。

public MyClass : IClass 
{ 
    private ILogger Logger; 
    public MyClass(ILogger Logger) 
    { 
     this.Logger = Logger; 
    } 
} 

既然在這個類中沒有任何引用「文件」的地方使得它更明顯的是目錄設置不屬於這裏。它屬於哪裏?可能在FileLogger本身。

使用依賴注入將離開你的東西,如:

main() { 
    // Poor man's DI, no frameworks here 
    var logger = new FileLogger("some/directory"); 
    var instance = new MyClass(logger); 
    return instance.DoSomethingUsefulThatEventuallyGetsLogged(); 
} 

希望幫助!

布蘭登

0

如何以及在哪裏實例化一個IFileLogger,它聽起來是設置其屬性的地方。

builder.RegisterType<FileLogger>().WithParameter(new NamedParameter("directoryPath", @"c:\temp")).As<IFileLogger>(); 

有了這個配置,您將使用建設者隨時解決IFileLogger,它將使用「C:\ TEMP」的目錄路徑。

+0

這將通過IOC容器 – Jon 2012-03-22 14:46:03

+0

完成在這種情況下,FileLogger構造應在參數RepositoryPath,(並將其設置爲當然RepositoryPath屬性),你應該注入參數而你正在解決IFileLogger。 – user484189 2012-03-22 14:55:00

+0

您使用哪種IOC框架? – user484189 2012-03-22 14:57:16

0

一般來說,我會說你的對象應該準備好使用一次構造,並且不得不調用其他方法/屬性來準備它只是混淆。所以記錄器在將它傳遞到MyClass之前應該已經設置了它的DirectoryPath屬性。 E.g:

SomeInitialisationMethod 
    () 
{ 
    // or use IOC "factory" to create necessary concrete version. 
    IFileLogger logger = new LoggerVariant("path"); 

    // MyClass can now use the ready to use logger. If we need to set the DirectoryPath, we can do it on this calling stack through the logger. 
    MyClass myClass = new MyClass(logger); 
+0

你會怎麼做? – Jon 2012-03-22 14:50:16

+0

如果MyClass ie IClass是具有InitlisationMethod的類的構造函數參數,該怎麼辦?這就是我的代碼的樣子 – Jon 2012-03-22 15:03:51