如何使用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?
答
您可以通过解决方法通过构造函数参数:
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)
您的服务将被注入并且宽度/高度可以通过解析来传递。
答
暂且不论讨论,是否需要在应该使用依赖注入您的视图模型,恕我直言,这是你可以使用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
委托,但这种情况下它不起作用。
老实说,我会继续做你在做什么。你想改变你现在的方法有什么特别的原因吗? – mjwills
你尝试过文档吗? http://docs.autofac.org/en/latest/register/parameters.html –
Docs解释了如何添加硬编码参数,但我需要在运行时设置参数。 – Oblomingo