如何在ObjectFactory.Initialize调用StructureMap中使用命名实例?

| 我正在尝试执行以下引导程序:
            x.For(Of IErrorLogger).Use(Of ErrorLogger.SQLErrorLogger)().
                Ctor(Of IErrorLogger)(\"backupErrorLogger\").Is(ObjectFactory.GetNamedInstance(Of IErrorLogger)(\"Disk\"))

            x.For(Of IErrorLogger).Add(
                Function()
                    Return New ErrorLogger.DiskErrorLogger(
                        CreateErrorFileName(ServerMapPath(GetAppSetting(\"ErrorLogFolder\"))))
                End Function).Named(\"Disk\")
但它显示此错误: StructureMap异常代码:200 找不到名为\“ Disk \”的PluginType Logging.IErrorLogger实例 我有点理解为什么会这样。.问题是,如何在注册表中利用命名实例?也许像SQLErrorLogger的ctor参数的惰性初始化一样?我不确定如何实现它。 在此先感谢您提供的任何帮助。     
已邀请:
        我在最新版本的StructureMap(2.6.1)中找到了正确的方法:
x.For(Of IErrorLogger).Use(Of ErrorLogger.SQLErrorLogger)().
    Ctor(Of IErrorLogger)(\"backupErrorLogger\").Is(
        Function(c) c.ConstructedBy(Function() ObjectFactory.GetNamedInstance(Of IErrorLogger)(\"Disk\"))
        )

x.For(Of IErrorLogger).Add(Function() _
        New ErrorLogger.DiskErrorLogger(
            CreateErrorFileName(ServerMapPath(GetAppSetting(\"ErrorLogFolder\"))))
        ).Named(\"Disk\")
注意,对于Ctor的Is方法,我们需要提供一个func(IContext),并使用IContext.ConstructedBy(Func())调用ObjectFactory.Get ...在这种情况下成功注册IErrorLogger。 据我所知,这是唯一的方法。其他的Icontext方法(例如IsThis和Instance)仅适用于已注册的类型。     
        您的问题是您正在尝试在配置容器之前访问它。为了使Structuremap在配置后评估对象分辨率,您需要向
Is
函数提供一个lambda。尝试解析注册的类型时,将评估lambda。
x.[For](Of ILogger)().Add(Of SqlLogger)().Ctor(Of ILogger)(\"backupErrorLogger\")_
    .[Is](Function(context) context.GetInstance(Of ILogger)(\"Disk\"))
x.[For](Of ILogger)().Add(Of DiskLogger)().Ctor(Of String)(\"errorFileName\")_
    .[Is](CreateErrorFileName(ServerMapPath(GetAppSetting(\"ErrorLogFolder\"))))_
    .Named(\"Disk\")
免责声明:我不是完全了解VB.NET中的lambda语法,但我希望我做对了。 编辑: 我在发布前尝试过的有效C#版本是这样的:
ObjectFactory.Initialize(i =>
            {
                i.For<ILogger>().Add<SqlLogger>()
                    .Ctor<ILogger>(\"backup\").Is(
                        c => c.GetInstance<ILogger>(\"disk\"))
                    .Named(\"sql\");
                i.For<ILogger>().Add<DiskLogger>().Named(\"disk\");
            });

var logger = ObjectFactory.GetNamedInstance<ILogger>(\"sql\");
    

要回复问题请先登录注册