Ваша проблема в том, что вы пытаетесь получить доступ к контейнеру до его настройки. Чтобы заставить structmap оценить разрешение объекта после конфигурации, вам нужно указать лямбду для функции Is
. Лямбда будет оцениваться при попытке разрешить зарегистрированный тип.
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, но надеюсь, что все правильно понял.
Редактировать:
Рабочая версия 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");