Я пытаюсь реализовать свой собственный перехват, все еще используя контейнер Unity.Я хочу сделать это таким образом, чтобы он уважал время жизни менеджера.то есть, если это PerResolveLifetimeManager, то я хочу один раз обернуть экземпляр, и я хочу, чтобы этот обернутый экземпляр использовался на протяжении всего разрешения.
До сих пор я реализовал BuilderStrategy, который добавляю в свой контейнер с помощью пользовательского класса UnityContainerExtension (я передаю PostInitialization методу AddNew; я не уверен, какое значение является наиболее подходящим, но это, похоже, работает).В переопределении PostBuildUp в моем BuilderStrategy я заменяю context.Existing на мое упакованное значение.
Когда я использую это с временем жизни PerResolve, происходит одна перенос, но только первое использование зависимости получает завернутый экземпляр иостальные получают не завернутый экземпляр.т. е. если мой ctor использует IFoo foo1 и IFoo foo2, то только foo1 является моим обернутым экземпляром, а 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 и отладили Main до разрешения Bar, вы увидите, что PostBuildUp вызывается только один раз.Однако в конструкторе Bar f1 является экземпляром Foo2 («обернутый» экземпляр), в то время как f2 и f3 являются экземплярами Foo1 (развернутый).
Мне было интересно, возможно ли то, что я хочу, и выбираю ли я правильный подход?Мои проблемы связаны с временем жизни и / или UnityBuildStage, для которого я добавил BuilderStrategy?
Спасибо