Невозможно вызвать BuildUp из частного или внутреннего конструктора с StructureMap - PullRequest
3 голосов
/ 27 июля 2011

В одном из моих классов у меня есть внутренний конструктор, который используется для модульного тестирования, и приватный конструктор, который вызывает мое приложение. Внутренний имеет параметры для моих зависимостей, в то время как закрытый конструктор не имеет параметров и вызывает BuildUp, чтобы использовать инъекцию сеттера. Как-то код вылетает на меня со следующей ошибкой:

StructureMap Exception Code:  245
Error while trying to create an InstanceBuilder for My.Namespace.And.Class, My.Assembly, Version=5.0.0.0, Culture=neutral, PublicKeyToken=null
at StructureMap.Graph.PluginCache.<.cctor>b__1(Type t) in c:\code\structuremap\Source\StructureMap\Graph\PluginCache.cs:line 40
at StructureMap.Util.Cache`2.get_Item(KEY key) in c:\code\structuremap\Source\StructureMap\Util\Cache.cs:line 82
at StructureMap.Graph.PluginCache.FindBuilder(Type pluggedType) in c:\code\structuremap\Source\StructureMap\Graph\PluginCache.cs:line 52
at StructureMap.Container.BuildUp(Object target) in c:\code\structuremap\Source\StructureMap\Container.cs:line 243
at StructureMap.ObjectFactory.BuildUp(Object target) in c:\code\structuremap\Source\StructureMap\ObjectFactory.cs:line 297

Object reference not set to an instance of an object.
at StructureMap.Construction.ConstructorFunctionBuilder`1.CreateBuilder(Plugin plugin) in c:\code\structuremap\Source\StructureMap\Construction\ConstructorFunctionBuilder.cs:line 25
at StructureMap.Construction.BuilderCompiler.FuncCompiler`1.CreateBuilder(Plugin plugin) in c:\code\structuremap\Source\StructureMap\Construction\BuilderCompiler.cs:line 51
at StructureMap.Construction.BuilderCompiler.CreateBuilder(Plugin plugin) in c:\code\structuremap\Source\StructureMap\Construction\BuilderCompiler.cs:line 12
at StructureMap.Graph.PluginCache.<.cctor>b__1(Type t) in c:\code\structuremap\Source\StructureMap\Graph\PluginCache.cs:line 36

Если я изменю конструктор по умолчанию, чтобы он был общедоступным, а не закрытым или даже внутренним, тогда все будет работать, как и ожидалось. Это предполагаемое поведение с частными и внутренними конструкторами или это ошибка?

1 Ответ

6 голосов
/ 27 июля 2011

Да, вам нужен общедоступный конструктор для структуры карты для автоматической настройки экземпляра.

ИМХО, если вы делаете явные вызовы для контейнера (BuildUp), то вы добавляете связь с DI, что лишает некоторой цели DI (удалять связь).Я очень предпочитаю придерживаться простого инжектора конструктора , затем, если мне по какой-то причине нужно явно заполнить зависимости, просто вызовите запрос контейнера для конкретного класса (ObjectFactory.GetInstance<Class>()), и он автоматически заполнитсязависимости в самом сложном публичном конструкторе.

...