Контейнер единицы: Используя PerResolveLifetimeManager и пользовательский перехват

Я пытаюсь реализовать свой собственный перехват все еще с помощью контейнера Единицы. Я хочу сделать это таким способом, где он уважает пожизненного используемого менеджера. т.е. если это - PerResolveLifetimeManager затем, я хочу иметь, переносят экземпляр однажды, и я хочу, который перенес экземпляр, который будет использоваться всюду по твердости.

До сих пор я реализовал BuilderStrategy, который я добавляю к своему контейнеру с помощью пользовательского класса UnityContainerExtension (я передаю PostInitialization методу AddNew; я не уверен, что большая часть соответствующего значения всего лишь, это, казалось, работало). В переопределении PostBuildUp в моем BuilderStrategy я заменяю контекст. Существующий с моим перенесенным значением.

То, когда я использую это со временем жизни PerResolve, каждый переносится, происходит, но только первое использование зависимости получает перенесенный экземпляр, и остальные получают не перенесенный экземпляр. т.е. если мой ctor берет в IFoo foo1, и IFoo foo2 затем только foo1 является моим перенесенным экземпляром whileas foo2, развернутый экземпляр.

Вот демонстрационная репродукция (для простоты, я использую экземпляр другого класса, Foo2, вместо того, чтобы перенестись):

public class MyInterception : UnityContainerExtension
{
    protected override void Initialize()
    {
        Context.Strategies.AddNew<MyInterceptionStrategy>(UnityBuildStage.PostInitialization);
    }
}

public class MyInterceptionStrategy : BuilderStrategy
{
    public override void PostBuildUp(IBuilderContext context)
    {
        if (!context.OriginalBuildKey.Type.IsInterface)
        {
            return;
        }

        context.Existing = new Foo2();
    }
}

public class Bar
{
    public Bar(IFoo f1, IFoo f2, IFoo f3)
    {
    }
}

public interface IFoo
{
}

public class Foo1 : IFoo
{
}

public class Foo2 : IFoo
{
}

public void Main()
{
    UnityContainer container = new UnityContainer();
    container.AddNewExtension<MyInterception>();
    container.RegisterType(typeof (IFoo), typeof (Foo1), new PerResolveLifetimeManager());

    container.Resolve<Bar>();
}

Если Вы помещаете точку останова в PostBuildUp и в конструктора Bar и отлаживаете Основной через твердость Панели, Вы видите, что PostBuildUp только называют однажды. Однако в конструкторе Bar, f1 является экземпляром Foo2 ("перенесенный" экземпляр), whileas f2 и f3 являются экземплярами (развернутого) Foo1.

Я задавался вопросом, возможно ли то, что я хочу, и если я проявляю правильный подход? Мои проблемы связаны со временем жизни и/или UnityBuildStage, для которого я добавил BuilderStrategy?

Спасибо

7
задан lotrij 17 June 2010 в 13:51
поделиться