Register和RegisterType之间的Autofac区别

Swe*_*ell 7 autofac

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

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

builder.RegisterType<ConsoleOutputService>().As<IOutputService>();
Run Code Online (Sandbox Code Playgroud)

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

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

builder.Register(c => new MultipleOutputService(outputFilePath)).As<IOutputService>();
Run Code Online (Sandbox Code Playgroud)

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

builder.RegisterType<MultipleOutputService(outputFilePath)>().As<IOutputService>();
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的帮助

SLa*_*aks 10

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

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


Pet*_*old 5

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


Han*_*ouw 5

顺便说一句,有一个更好的解决方案,这个Autofac引入了.WithParameter()他们的注册生成器的扩展.

.RegisterType<MultipleOutputService>().As<IOutputService>().WithParameter("parameterName", "parameterValue");
Run Code Online (Sandbox Code Playgroud)

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