如何使用autofac在构造函数中将参数注入类中?

问题描述:

我正在开发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

您可以通过解决方法通过构造函数参数:

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.

暂且不论讨论,是否需要在应该使用依赖注入您的视图模型,恕我直言,这是你可以使用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委托,但这种情况下它不起作用。