Как мне разрешить массив с Unity и передать параметр одному из элементов в массиве? - PullRequest
1 голос
/ 09 сентября 2010

Итак, вот мой фабричный метод, который принимает параметр ...

            container.RegisterInstance<Func<IProductInstance, IQuantityModifier[]>>(
            instance => container.Resolve<IQuantityModifier[]>());

Теперь один элементов, возвращаемых массивом, принимает параметр IProductInsance в своем конструкторе. Я не могу понять, как заставить Unity передать параметр или, если я вместо этого сделаю аргумент конструктора свойством, как заставить Unity установить свойство. Кажется, никакие переопределения зависимостей, параметры внедрения и т. Д. Ничего не делают.

Конечно, обе эти ситуации были бы просты, если бы я разрешал один экземпляр, но с массивом Unity, похоже, не полностью обрабатывал каждый элемент.

Есть идеи? То, что я в итоге сделал, это что-то вроде ...

            container.RegisterInstance<Func<IProductInstance, IQuantityModifier[]>>(
            instance =>
                {
                    var items = container.Resolve<IQuantityModifier[]>();

                    QuantityModifier item = items.OfType<QuantityModifier>().SingleOrDefault();

                    if (item != null)
                    {
                        item.ProductInstance = instance;
                    }

                    return items;
                };

Я полагаю, что в идеале элемент, для которого требуется параметр, будет создан фабрикой, но тогда Unity должна будет передать правильное значение фабрике и выполнить его.

Приветствия, Ян.

1 Ответ

1 голос
/ 11 сентября 2010

К сожалению, вы столкнулись с ошибкой в ​​контейнере. Переопределение решимости должно сделать правильную вещь здесь. Я подозреваю, что это та же причина, что и эта ошибка: http://unity.codeplex.com/workitem/8777

Я ищу в исходном коде контейнера, проблема в этом методе в ArrayResolutionStrategy:

    private static object ResolveArray<T>(IBuilderContext context)
    {
        IUnityContainer container = context.NewBuildUp<IUnityContainer>();
        List<T> results = new List<T>(container.ResolveAll<T>());
        return results.ToArray();
    }

Текущий набор переопределений является частью текущего контекста сборки, а не самого контейнера, поэтому при захвате контейнера и повторном разрешении этот контекст теряется.

Черт, мне придется выяснить, как это исправить.

...