TypedFactoryFacility:如何使用内联参数初始化对象?

时间:2011-06-14 11:02:38

标签: castle-windsor

如何使用TypedFactoryFacility生成与下面指定的相同的输出?

public class Something    
{
    public void Initialize(Whatever instance) {}
}

public interface ISomethingFactory
{
    Something Create(Whatever instance);
}

internal class SomethingFactory : ISomethingFactory
{
    private readonly IWindsorContainer _container;

    public SomethingFactory(IWindsorContainer container)
    {
        _container = container;
    }

    public Something Create(Whatever instance)
    {
        Something item = _container.Resolve<Something>();
        item.Initialize(instance);
        return item;
    }
}

所以我想用代理生成的ITypedFactoryFacility替换手动工厂,但我找不到在创建后在已解析组件上调用某些东西的方法。我查看了委托问题,但是您没有从自定义委托问题引用CreationContext,因此无法使用。我当然可以将依赖项移到ctor并提供一个ctor覆盖,但我认为当你想传达非可选的依赖项时属性是好的。

1 个答案:

答案 0 :(得分:2)

创建时不需要在实例上调用东西 - 当工厂方法签名中的参数名称与可以注入的内容相匹配时,Windsor会自动注入东西 - 是构造函数参数或公共财产......简短的例子(使用公共财产):

interface ISomeFactory
{
    Something CreateSomething(object dataSource);
}

class Something
{
    public object DataSource { get; set; }
}

鉴于这些注册如下:

container.Register(Component.For<ISomeFactory>().AsFactory(),
                   Component.For<Something>().Lifestyle.Transient)

您可以像这样解决Something的实例:

var aintThatSomething = someFactory.CreateSomething(new [] {"ZOMG!", "w00t!"});

请记住,如果与Something实例相关联的负担中的某些内容需要停用,则您还需要在工厂中提供适当的Release方法。