Register和RegisterType之间的Autofac区别

时间:2011-11-02 17:08:38

标签: autofac

我已经开始在本教程后使用Autofac: http://flexamusements.blogspot.com/2010/09/dependency-injection-part-3-making-our.html

构造函数中没有参数的简单类

builder.RegisterType<ConsoleOutputService>().As<IOutputService>();

如教程中所述,上面的代码可以理解为:setup ConsoleOutputService作为IOutputService的实现

构造函数中带有一个参数的简单类

builder.Register(c => new MultipleOutputService(outputFilePath)).As<IOutputService>();

我不明白为什么我们使用lambda表达式来注册这个类(以及这个表达式到底做了什么)以及为什么我们不能输入这段代码

builder.RegisterType<MultipleOutputService(outputFilePath)>().As<IOutputService>();

提前感谢您的帮助

3 个答案:

答案 0 :(得分:10)

您无法编写该代码,因为它在C#中没有意义 RegisterType是一种通用方法;泛型方法必须将 types 作为通用参数。

您正在尝试使用自定义方式注册类型来创建它(在您的情况下,构造函数参数); C#支持指定此类事物的唯一方法是lambda表达式(或其他委托)。

答案 1 :(得分:5)

顺便说一句,这个Autofac有一个更好的解决方案,它向注册构建器引入了.WithParameter()扩展名。

.RegisterType<MultipleOutputService>().As<IOutputService>().WithParameter("parameterName", "parameterValue");

这应该满足您需要将除接口类型之外的内容传递给其中一个构造函数的事件

答案 2 :(得分:2)

lambda变体使我们能够在构造实例时做一些逻辑。