2

是否可以构建类似于 ISubDependencyResolver 但也支持 Release(...) 的东西?

我有一种情况,我希望能够在 Blender 的构造函数中解析 Fruit 的派生类:

abstract class Fruit
{
}

class AppleBlender
{
    AppleBlender(Apple a)
    {
    }
}

不幸的是,Apple 处于不同的程序集中,除非需要,否则我不想加载,因为有数百种不同的 Fruit 都有自己的程序集。

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;
    }
}

基本上我想要一种将“new Apple()”视为需要处理的瞬态对象的方法。我很高兴在这个上采用完全不同的轨道,但是需要在解析时(而不是启动时)加载“Apple”类型。

4

1 回答 1

2

Windsor 2.5 支持通过以下方式注册的组件的 OOTB UsingFactoryMethod(或更广泛地说,对于实现类型设置为 的组件LateBoundComponent

于 2010-07-26T11:59:23.530 回答