Autofac:如何注册和解析其构造函数需要 DirectoryInfo 对象的类型?

问题描述 投票:0回答:1

我正在尝试做一些我怀疑在 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
类型?文档似乎没有涵盖这种细微差别,至少我找不到。

dependency-injection parameters constructor autofac
1个回答
0
投票

我能够使用 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)

现在很容易解决。

© www.soinside.com 2019 - 2024. All rights reserved.