Я пытаюсь реализовать свой собственный перехват все еще с помощью контейнера Единицы. Я хочу сделать это таким способом, где он уважает пожизненного используемого менеджера. т.е. если это - 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?
Спасибо