ISubDependencyResolverのように機能するが、Release(...)もサポートするものを構築することは可能ですか?
BlenderのコンストラクターでFruitの派生クラスを解決できるようにしたい状況があります。
abstract class Fruit
{
}
class AppleBlender
{
AppleBlender(Apple a)
{
}
}
残念ながら、Appleは別のアセンブリにあり、必要になるまでロードしたくありません。何百もの異なる種類のフルーツがすべて独自のアセンブリを持っているからです。
ISubDependencyResolverは、私のフルーツの一部が使い捨てであることを除いて、これに最適です。そのため、それらを解放する方法が必要です。
DefaultDependencyResolverから派生することがこれを達成する唯一の方法ですか?
編集:より包括的な例。
[TestFixture]
public class SubResolverFixture
{
[Test]
public void ResolvedInstanceShouldBeDisposed()
{
IKernel kernel = new DefaultKernel();
kernel.Resolver.AddSubResolver(new TestResolver());
kernel.Register(Component.For<AppleBlender>().LifeStyle.Transient);
AppleBlender ab = kernel.Resolve<AppleBlender>();
kernel.ReleaseComponent(ab);
Assert.That(ab.IsDisposed);
Assert.That(ab.Apple.IsDisposed);
}
}
public class TestResolver : ISubDependencyResolver
{
public object Resolve(CreationContext context, ISubDependencyResolver contextHandlerResolver, ComponentModel model, DependencyModel dependency)
{
return new Apple();
}
public bool CanResolve(CreationContext context, ISubDependencyResolver contextHandlerResolver, ComponentModel model, DependencyModel dependency)
{
return typeof(Fruit).IsAssignableFrom(dependency.TargetType);
}
}
public abstract class Fruit : IDisposable
{
public bool IsDisposed
{
get;
set;
}
public void Dispose()
{
IsDisposed = true;
}
}
public class Apple : Fruit
{
}
public class AppleBlender : IDisposable
{
public AppleBlender(Apple apple)
{
Apple = apple;
}
public Apple Apple
{
get;
set;
}
public bool IsDisposed
{
get;
set;
}
public void Dispose()
{
IsDisposed = true;
}
}
基本的に、「新しいApple()」を破棄する必要のある一時的なオブジェクトとして扱う方法が必要です。これでまったく別のトラックを使用できることを完全に嬉しく思いますが、タイプ「Apple」は解決時に(起動時ではなく)ロードする必要があります。