Почему пользовательская стратегия сборки Unity возвращает null даже после установки существующего свойства

#.net #unity-container #prism #unity2.0 #objectbuilder

#.net #unity-контейнер #призма #единство 2,0 #объектный конструктор #unity-container #prism #unity2.0 #objectbuilder

Вопрос:

Я использую версию 2 Unity (которая поставляется с Prism4). Я пытаюсь написать расширение, которое может возвращать перечисляемый незарегистрированный тип. Следующий код — это то, что я написал, но я получаю null после вызова resolve.

         class EnumerableStrategy : BuilderStrategy
        {
            public override void PreBuildUp(IBuilderContext context)
            {
                context.Existing = new []{"Test"};
                context.BuildComplete = true;
            }
        }

        class EnumerableExtension : UnityContainerExtension
        {
            protected override void Initialize()
            {
                Context.BuildPlanStrategies.AddNew<EnumerableStrategy>( Microsoft.Practices.Unity.ObjectBuilder.UnityBuildStage.PreCreation);
            }
        }
        static void Main(string[] args)
        {

            var container = new UnityContainer();
            container.AddNewExtension<EnumerableExtension>();
            var items = container.Resolve<IEnumerable<string>>();
            foreach (var item in items)
                Console.WriteLine(item.ToString());
        }
  

Переменная Items оказывается равной null. Почему?

Комментарии:

1. Какая версия Unity поставляется с Prism4?

2. 2.0. Только что обновил вопрос

Ответ №1:

Добавьте стратегию в коллекцию Strategies, а не BuildPlanStrategies.

BuildPlanStrategies предназначен для построения объектов, которые будут создавать разрешенные объекты. Это не то, что вы делаете — вы просто возвращаете объекты напрямую. Я удивлен, что вы получили null, на самом деле — я бы ожидал, что где-то там будет недопустимое исключение приведения.