我正在开发WPF应用程序,并且我使用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 :(得分:3)
您可以通过resolve方法传递构造函数参数:
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)
您的服务将被注入,宽度/高度可以通过解决方式传递。
答案 1 :(得分:0)
暂且不讨论,你应该为View Models使用依赖注入,恕我直言,这是你可以使用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
委托,但在这种情况下它不起作用。