私は現在、クラスをデコレータでラップし、実行時に依存関係の1つに注入しようとしています。私は現在、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
を尊重しますか?
私は同じ問題で戦っています。実際には、複雑なセットアップも必要ありません。あなたがデコレータを持っていなくても、ファクトリデリゲートを持つStorageを登録していれば、問題は同じです。あなたは偶然に何か解決策を見つけましたか? – quetzalcoatl
@quetzalcoatl私はこのIoCコンテナをあきらめて解決策を見つけませんでした。 –
Heh。ええ、私は同じことができ、DryIocで何かをすることができればいいと思います。でも、ウィンザーはもっと予測可能です。しかし、この古いプロジェクトではコードを変更するにはあまりにも多くのコードを、それにはあまりにも時間がかかりません。迅速な返信をありがとう!たぶん私は何かを見つけて後でそれを掲示するでしょう。 – quetzalcoatl