2017-06-13 44 views
0

我正在開發WPF應用程序,我使用autofac進行依賴注入。 這不是一個問題,注入一些服務,查看模型參數的構造函數:如何使用autofac在構造函數中將參數注入類中?

public class RoomViewModel 
{ 
    private ISomeService _someService; 
    public (ISomeService someService) 
    { 
     _someService = someService; 
    } 
} 

但我不知道如何注入服務,查看模型參數。例如:

public class BedViewModel 
{ 
    public BedViewModel(double width, double height) 
    { 
     //Some logic 
    } 
} 

我動態運行時創建BedViewModel,像這樣:

BedViewModel model = new BedViewModel(width, height); 

這樣的問題,如何注入服務BedViewModel?

+0

老實說,我會繼續做你在做什麼。你想改變你現在的方法有什麼特別的原因嗎? – mjwills

+0

你嘗試過文檔嗎? http://docs.autofac.org/en/latest/register/parameters.html –

+0

Docs解釋瞭如何添加硬編碼參數,但我需要在運行時設置參數。 – Oblomingo

回答

3

您可以通過解決方法通過構造函數參數:

var reader = scope.Resolve<ConfigReader>(new NamedParameter("configSectionName", "sectionName")); 

在您的例子那就是:

var widthParam = new NamedParameter("width", width); 
var heightParam = new NamedParameter("height", height); 
var bedViewModel = scope.Resolve<BedViewModel>(widthParam, heightParam); 

所以,如果你有一個像下面這樣的構造:

BedViewModel(IMyService myService, double width, double height) 

您的服務將被注入並且寬度/高度可以通過解析來傳遞。

See here for documentation.

0

暫且不論討論,是否需要在應該使用依賴注入您的視圖模型,恕我直言,這是你可以使用delegate factory的理想場所。

所有你需要創建一個委託來告訴Autofac你想如何構建首先你BedViewModel

public delegate BedViewModel BedViewModelFactory(double width, double height); 

然後,你需要把這個工廠注入到要在其中創建BedViewModel實例類並用它來創建您的視圖模型:

public SomeClass 
{ 
    public SomeClass(BedViewModelFactory bedViewModelFactory) 
    { 
     var bedViewModel = bedViewModelFactory(1.0, 2.0); 
    } 
} 

您只傳遞寬度和高度參數,所有其他參數將由容器爲您解析。

如果您的自定義參數是不同的類型,您可以使用Func委託,但這種情況下它不起作用。

相關問題