WindsorContainer TypedFactory如何将参数传递给间接对象

时间:2013-04-12 07:26:15

标签: c# castle-windsor castle windsor-3.0 windsor-facilities

我知道TypedFactory工具只会将给定的参数传递给它正在解析的对象。但有没有办法让相同的参数传递给正在解析的所有间接对象?

我一直尝试使用定义为

的自定义范围来执行此操作
public class ArgumentPassThrough : IScopeAccessor
    {
        private static IDictionary _args;
        public void Dispose()
        {
            _args = null;
        }

        public ILifetimeScope GetScope(CreationContext context)
        {
            var h = context.Handler;
            if (_args == null)
            {
                _args = context.AdditionalArguments;
            }
            else
            {
                var enumerator = _args.GetEnumerator();
                enumerator.Reset();
                while (enumerator.MoveNext())
                {
                    if (!context.AdditionalArguments.Contains(enumerator.Key))
                    {
                        context.AdditionalArguments.Add(enumerator.Key, enumerator.Value);
                    }
                }
            }

            return new DefaultLifetimeScope();
        }
    }

我有以下类结构:

        public class Child2
        {
            public Child2(Child1 child1)
            {
                Child1 = child1;
            }

            public Child1 Child1 { get; private set; }
        }

        public class Child1
        {
            public Child1()
            {
            }
        }


public class Parent
{
            public Parent(Child1 child1, Child2 child2)
            {
                Child1 = child1;
                Child2 = child2;
            }

            public Child1 Child1 { get; private set; }
            public Child2 Child2 { get; private set; }
    }

    public interface IParentFactory
    {
        Parent Create(Child1 child1);
    }

我在windsorcontainer注册它们:

    public void ScopedFactory()
    {
        _container.Register(

            Component.For<IParentFactory>().AsFactory(),
            Component.For<Parent>().LifestyleScoped<ArgumentPassThrough>(),
            Component.For<Child2>().LifestyleScoped<ArgumentPassThrough>(),

            Classes.FromThisAssembly().Pick()
                   .WithService.Self()
                   .LifestyleTransient()
            );
    }

我正在使用它:

    [Test]
    public void ScopedFactoryDependency()
    {
        _demoModule.ScopedFactory();
        var fac = _container.Resolve<IParentFactory>();

        var p1 = AssertPassThrough(fac);
        var p2 = AssertPassThrough(fac);
        Assert.AreNotSame(p1,p2);
    }

    private Parent AssertPassThrough(IParentFactory fac)
    {
        Parent parent;
        var c1 = _container.Resolve<Child1>();
        using (_container.BeginScope())
        {
            parent = fac.Create(c1);
            Assert.AreSame(parent.Child1, c1);
            Assert.AreSame(parent.Child2.Child1, c1);
        }
        return parent;
    }

第一遍有效,但我希望在_contaier.BeginScope()存在using块时处理ScopeAccesor。这不会发生,第二遍将获得与第一遍相同的参数。

0 个答案:

没有答案