현재 클래스를 데코레이터에 래핑하고 런타임에 의존성 중 하나에 주입하려고합니다. 현재 StorageCacheDecorator
및 Storage
에 의해 구현되는 IStorage
의 인터페이스가 있습니다. StorageCacheDecorator
은 IStorage
및 Storage object takes in a
Context` 객체를 취합니다. 그러나 이러한 클래스가 해결 될 때마다 컨텍스트 개체가 전달되어야합니다.Unity IoC InjectionFactory DependencyOverride를 준수하지 않습니다.
public interface IStorage
{
}
public class Storage : IStorage
{
public Context Context { get; }
public Storage(Context context)
{
this.Context = context;
}
}
public class StorageCacheDecorator : IStorage
{
public IStorage InnerStorage { get; }
public StorageCacheDecorator(IStorage innerStorage)
{
this.InnerStorage = innerStorage;
}
}
public class Context
{
}
내가 구현 세부 사항을 생략 한 아래의 테스트는 우리가 테스트 할 방법
[Test]
public void ShouldResolveWithCorrectContext1()
{
var context = new Context();
var container = new UnityContainer();
container.RegisterType<IStorage, Storage>();
var resolve = container.Resolve<IStorage>(new DependencyOverride<Context>(context));
Assert.That(resolve, Is.TypeOf<Storage>());
Assert.That(((Storage)resolve).Context, Is.SameAs(context));
}
를 전달하는 장식을 제거하면
[Test]
public void ShouldResolveWithCorrectContext()
{
var context = new Context();
var container = new UnityContainer();
container.RegisterType<Storage>();
container.RegisterType<IStorage>(
new InjectionFactory(c => new StorageCacheDecorator(
c.Resolve<Storage>())));
var resolve = container.Resolve<IStorage>(new DependencyOverride<Context>(context));
Assert.That(resolve, Is.TypeOf<StorageCacheDecorator>());
var cacheDecorator = ((StorageCacheDecorator)resolve);
Assert.That(cacheDecorator.InnerStorage, Is.TypeOf<Storage>());
var storage = ((Storage)cacheDecorator.InnerStorage);
Assert.That(storage.Context, Is.SameAs(context));
}
그러나 내 문제의 예를 제공합니다 InjectionFactory
은 DependencyOverride
을 존중합니까?
나는 같은 문제로 싸우고 있습니다. 실제로 복잡한 설정이 필요하지 않습니다. 데코레이터가없고 Factory Delegate가있는 Storage를 등록한 경우 문제는 동일합니다. 우연히 어떤 해결책을 찾았습니까? – quetzalcoatl
@quetzalcoatl 나는이 IoC 컨테이너를 그냥 포기한 해결책이 없음을 알아 냈습니다. –
Heh. 그래, 내가 똑같이 할 수 있었으면 좋겠어. DryIoc이나 무엇이든, 심지어 평범한 '윈저'가 더 예측 가능하길. 그러나이 오래된 프로젝트에서 변경하기에는 너무 많은 코드가 필요하고 너무 적은 시간이 필요합니다. 빠른 답변을 보내 주셔서 감사합니다! 아마 뭔가를 찾아 나중에 게시 할 것입니다. – quetzalcoatl