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

时间:2017-06-13 13:48:09

标签: c# wpf dependency-injection autofac

我正在开发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注入服务?

2 个答案:

答案 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)

您的服务将被注入,宽度/高度可以通过解决方式传递。

here

答案 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委托,但在这种情况下它不起作用。