簡體   English   中英

在類依賴項上分配屬性

[英]Assigning properties on class dependencies

可以說我有一個將IFileLogger用作構造函數參數的類。

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

在該類的某個地方,它調用Logger.Write("Data");

IFileLogger具有DirectoryPath的屬性;

需要進行設置,以便IFileLogger知道將文件寫入到哪里。

如何設置?

我的想法是在要設置的類上具有一個屬性,然后在構造函數中具有類似IFileLogger.DirectoryPath = this.DirectoryPath的屬性。

但這似乎是錯誤的,因為IClass需要在其中包含屬性,而您最終創建了僅在底層需要的屬性鏈。

您能幫助看不見樹木的人嗎? 您還會編寫測試,以及如何確定IFileLogger的DirectoryPath是否已填充?

您如何以及在何處實例化IFileLogger,這似乎是設置其屬性的地方。

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

使用此配置,無論何時使用該構建器解析IFileLogger,它都將使用“ c:\\ Temp”作為directoryPath。

通常,我想說您的對象一旦構造就應該准備好使用,而不得不調用其他方法/屬性來使其准備就緒只會令人困惑。 因此,在將Logger傳遞到MyClass之前,應該已經設置了DirectoryPath屬性。 例如:

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);

我可能建議您的界面設計是這里的問題,而您的問題是氣味的指示?

IFileLogger代表你的等級取決於接口。 這樣,在接口上我們看到有一個Write方法。 問題是, MyClass並不真正在乎日志的發生方式,只是它符合接口。 話雖這么說,以為MyClass需要知道目錄位置才能告訴IFileLogger如何工作,這種想法告訴您責任錯位了。

代碼需要IFileLogger什么? 記錄,對不對? 讓我們對代碼進行一些重構,並實現滿足客戶端MyClass需求的接口。 他不在乎日志是如何發生的,只是日志發生。

將接口重命名為ILogger

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();
}

希望有幫助!

布蘭登

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM