簡體   English   中英

使用Unity的構造函數中使用的屬性依賴注入

[英]Property Dependency Injection used in Constructor using Unity

好吧,我有一個在基類中定義的依賴屬性,我試圖在其派生類的構造函數中使用它,但是這不起作用,該屬性顯示為null。 Unity使用container.Resolve()解析實例后解析依賴屬性;

我有一個替代方法是將IUnityContainer參數添加到我的MyViewModel類構造函數中,並將ILogger屬性設置為我自己,例如:

public MyViewModel(IUnityContainer container)
{
  Logger = container.Resolve<ILogger>();
}

編輯: @Wiktor_Zychla的另一個建議是將構造函數注入的參數傳遞為:

public MyViewModel(ILogger _logger)
{
    Logger = _logger;
}

這似乎工作正常,但我必須為我的所有派生的ViewModel做到這一點..

但后來我沒有在我的基類中使用帶注釋的ILogger依賴項。 請參閱下面的課程示例。 問題是:我有哪些替代方案,或者我做錯了什么?

謝謝!

我有一個像這樣的ViewModel基類:

public abstract class ViewModelBase
{
    [Dependency]
    public ILogger Logger { get; set; }
....
}

然后我有一個類推導出:

public class MyViewModel : ViewModelBase
{
    public MyViewModel()
    {
         //I want to use my dependent property in constructor, but doesn't 

         Logger.Error("PRINT AN ERROR");
    }
}

在我的應用程序入口點,我將我的ILogger注冊為單例和我的MyViewModel類:

container.RegisterType<ILogger, MyAppLogger>(new ContainerControlledLifetimeManager());
container.RegisterType<MyViewModel>();

Unity使用container.Resolve()解析實例后解析依賴屬性;

如果你考慮一下這很明顯。 只是嘗試手動執行此操作。 你不會成功的。 為了能夠注入屬性,必須有一個實例,並且有一個實例,意味着已經調用了構造函數。

您的問題是由於您在構造函數中做得太多而引起的。 從依賴注入的角度來看,構造函數應該只接受它的依賴項(檢查它們不是null),並將它們存儲在私有字段中。 做更多的事情是一種反模式。 你的構造函數中不應該有任何邏輯。

在構造函數中具有邏輯使得創建對象圖不可靠,而構建對象圖應該快速且可靠。

當你遵循這個原則時,就不會有問題,因為一旦你運行任何業務邏輯,你的類就會被完全實例化。 由於構造函數除了設置私有字段之外什么都不做,因此沒有任何問題可以解決,並且沒有任何理由調用Logger.Error("PRINT AN ERROR"); 就像你在做。

1)只需刪除ContainerControlledLifetimeManager ,即可在每個視圖模型中使用記錄器的不同實例。

2)您可以通過在注冊時指定它來為每個視圖模型注冊不同Type的記錄器。

container.RegisterType<ILogger, MyAppLogger>();
container.RegisterType<ILogger, MyOtherLogger>("uniqueNameOfAnILoggerRegistration);
container.RegisterType<MyViewModel>(new InjectionConstructor(
    new ResolvedParameter(typeof(ILogger), "uniqueNameOfAnILoggerRegistration")));

使用構造函數注入,您的viewmodel將注入一個全新的MyOtherLogger實例。

由於屬性注入應保留為“很好有”值,並且您的類顯然依賴於記錄器的存在,我強烈建議使用ctor注入。

暫無
暫無

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

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