我正在尝试做一些我怀疑在 Autofac 中非常基本的事情(我刚刚开始了解 IoC/DI 概念,我仍然非常摇摇欲坠),但我遇到了死胡同。我发现的任何类似信息往往涵盖更复杂的场景(委托、泛型等)。我的只涉及一个简单的 ol'
DirectoryInfo
构造函数参数。
我有一个类型在其构造函数中使用一个
DirectoryInfo
对象,我想使用 Autofac 注册并解析该类型:
Imports System.IO
Friend Class UpdateCommand
Implements IUpdateCommand
Public Sub New(Root As DirectoryInfo)
End Sub
End Class
这是我的注册码:
oBuilder = New ContainerBuilder
oBuilder.RegisterType(Of UpdateCommand).As(Of IUpdateCommand)()
oContainer = oBuilder.Build
但是当我尝试解决它时:
Using oScope As ILifetimeScope = oContainer.BeginLifetimeScope
oUpdateCommand = oScope.Resolve(Of IUpdateCommand)
End Using
我得到一个错误:
DependencyResolutionException:在“VsLayout.UpdateCommand”类型上找到的构造函数都不能用可用的服务和参数调用: 无法解析构造函数“Void .ctor(System.IO.DirectoryInfo, Years, Editions)”的参数“System.IO.DirectoryInfo Root”。
该异常消息包含一个文档链接,它重定向并告诉我们:
最后,您的构造函数中可能有一个实际上不是服务的参数,并且在容器中不可用。例如,您通常不会在容器中注册纯字符串或整数值,但如果您的构造函数采用这样的值,它将无法运行。在这种情况下,您可以在注册时声明一个Parameter以提供额外的参数。
该链接反过来告诉我们:
你可以为此使用 lambda 表达式组件
我希望那会是我的啊哈!时刻,但我尝试修改我的注册:
oBuilder.Register(Function(x)
oRoot = New DirectoryInfo("S:\SomeDirectory")
Return New UpdateCommand(oRoot)
End Function).As(Of IUpdateCommand)()
...然后我得到了一个不同的错误:
ComponentNotRegisteredException: 请求的服务
还没有注册System.Object
那个让我完全陷入困境。
System.Object
? that 应该来自哪里?我现在正式迷路了。
如何才能成功注册并解决我的
UpdateCommand
类型?文档似乎没有涵盖这种细微差别,至少我找不到。
我能够使用 this answer 中建议的语法来解析我的类型,它在我发布后立即出现在 Related questions 部分中。
Dim oParameters As List(Of Parameter)
oRoot = New DirectoryInfo("S:\VisualStudio")
oParameters = New List(Of Parameter) From {
New NamedParameter(NameOf(BaseCommand.Root), oRoot)
}
oBuilder.RegisterType(Of UpdateCommand).As(Of IUpdateCommand).WithParameters(oParameters)
现在很容易解决。