Unity 컨테이너로 놀았으며 이상한 행동을 발견했습니다. 하나 이상의 인터페이스를 구현하는 클래스가 있습니다. 이 클래스를 다른 수명의 응용 프로그램에서 서로 다른 위치에서 사용하기를 원합니다. 그래서 IFooDerived1을 Foo에 Singleton으로 매핑하고 IFooDerived2를 Foo에 Transient로 매핑했습니다. 그러나 Foo의 등록은 Foo의 이전 등록을 손상시킵니다.LifetimeManager와 Unity RegisterType의 이상한 동작
샘플 :
interface IFoo { }
interface IFooDerived1 { }
interface IFooDerived2 { }
class Foo : IFoo, IFooDerived1, IFooDerived2 { }
static void Main(string[] args)
{
var container = new UnityContainer();
container.RegisterType(typeof(IFoo), typeof(Foo), new ExternallyControlledLifetimeManager());
container.RegisterType(typeof(IFooDerived1), typeof(Foo), new ContainerControlledLifetimeManager());
container.RegisterType(typeof(IFooDerived2), typeof(Foo), new TransientLifetimeManager());
foreach(var r in container.Registrations)
{
Console.WriteLine("{0} -> {1} : {2}", r.RegisteredType.Name, r.MappedToType.Name, r.LifetimeManagerType.Name);
}
}
출력 :
IFoo -> Foo : TransientLifetimeManager
IFooDerived1 -> Foo : TransientLifetimeManager
IFooDerived2 -> Foo : TransientLifetimeManager
이 올바른 행동인가? 아무도 논리적 인 설명을 줄 수 있습니까? 나는 다른 접근법을 쉽게 사용할 수 있으며, 왜 이런 일이 일어나는지 이해하고 싶습니다. 감사.
Unity의 걱정스러운 동작 외에도, IFooDerived2가 다른 구현을 제공하는 동작을 추출해야한다고 생각하기 때문에 디자인을 살펴볼 수도 있습니다. 새로운'FooDerived2' 구현은'IFoo'에 의존 할 수 있습니다. – Steven
예, 맞습니다. 디자인이 좋지 않습니다. 나는 이미 '진짜'코드를 수정했다. – boades
하지만 나는 당신과 동의합니다, 이것은 '흥미로운'행동입니다. – Steven