Dependency injection 如何使用Unity解析数组并将参数传递给数组中的一个项?

Dependency injection 如何使用Unity解析数组并将参数传递给数组中的一个项?,dependency-injection,inversion-of-control,unity-container,Dependency Injection,Inversion Of Control,Unity Container,这是我的工厂方法,它接受一个参数 container.RegisterInstance<Func<IProductInstance, IQuantityModifier[]>>( instance => container.Resolve<IQuantityModifier[]>()); container.RegisterInstance( instance=>container.Resolve());

这是我的工厂方法,它接受一个参数

            container.RegisterInstance<Func<IProductInstance, IQuantityModifier[]>>(
            instance => container.Resolve<IQuantityModifier[]>());
container.RegisterInstance(
instance=>container.Resolve());
现在,数组返回的其中一个项在其构造函数中采用IPProductInsance参数。我不知道如何获得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;
                };
container.RegisterInstance(
实例=>
{
var items=container.Resolve();
QuantityModifier项=items.OfType().SingleOrDefault();
如果(项!=null)
{
item.ProductInstance=实例;
}
退货项目;
};
我假设理想情况下,需要参数的项将由工厂创建,但Unity必须将正确的值传递到工厂并执行它


干杯,伊恩。

很遗憾,您在容器中遇到了一个错误。解决覆盖应该在这里做正确的事情。我怀疑这与此错误的根本原因相同:

我正在查找容器的源代码,问题在于ArrayResolutionsStrategy中的此方法:

    private static object ResolveArray<T>(IBuilderContext context)
    {
        IUnityContainer container = context.NewBuildUp<IUnityContainer>();
        List<T> results = new List<T>(container.ResolveAll<T>());
        return results.ToArray();
    }
私有静态对象ResolveArray(IBuilderContext上下文)
{
IUnityContainer container=context.NewBuildUp();
列表结果=新列表(container.ResolveAll());
返回结果。ToArray();
}
当前覆盖集是当前生成上下文的一部分,而不是容器本身,因此当它抓取容器并重新解析时,该上下文将丢失


该死,我得想办法解决这个问题。

很遗憾,您在容器中遇到了一个错误。解决覆盖应该在这里做正确的事情。我怀疑这与此错误的根本原因相同:

我正在查找容器的源代码,问题在于ArrayResolutionsStrategy中的此方法:

    private static object ResolveArray<T>(IBuilderContext context)
    {
        IUnityContainer container = context.NewBuildUp<IUnityContainer>();
        List<T> results = new List<T>(container.ResolveAll<T>());
        return results.ToArray();
    }
私有静态对象ResolveArray(IBuilderContext上下文)
{
IUnityContainer container=context.NewBuildUp();
列表结果=新列表(container.ResolveAll());
返回结果。ToArray();
}
当前覆盖集是当前生成上下文的一部分,而不是容器本身,因此当它抓取容器并重新解析时,该上下文将丢失


该死的,我得想办法解决这个问题。

我不明白你在做什么。这不是工厂方法,因为你没有创建返回值。根据你的代码,你只需要注册IPProductInstance接口我认为这是工厂方法!这是一个工厂,它接受IPProductInstance并返回一个IQuantityModifier[]。委托是方法,'instance'是IPProductInstance参数,'items'是IQuantityModifier数组。我不明白你在做什么。这不是工厂方法,因为你没有创建返回值。根据你的代码,你只需要注册IPProductInstance接口。我想这是工厂方法!这是一个获取IPProductInstance并返回IQuantityModifier[]。委托是方法,'instance'是IPProductInstance参数,'items'是IQuantityModifier数组。感谢您的回复。我认为这是一个bug。;)对于我提到的让ResolAll执行任何返回被解析类型项的工厂的想法,您有何看法?如果您使用InjectionFactory语法注册有问题的项,Unity现在将作为ResolveAll的一部分执行它。诀窍是把覆盖的东西放进去。谢谢你的回复。我还以为是虫子呢对于我提到的让ResolAll执行任何返回被解析类型项的工厂的想法,您有何看法?如果您使用InjectionFactory语法注册有问题的项,Unity现在将作为ResolveAll的一部分执行它。诀窍是把超控装置放进去。