2011-06-14 61 views
0

如何使用TypedFactoryFacility生成如下指定的相同输出?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重写,但是我认为当您想传达非可选依赖关系时,属性很好。

回答

2

你并不需要调用在创建实例的东西 - 温莎它将自动注入的东西当工厂方法签名参数的名称相匹配的东西,可以被注入 - 无论是构造PARAMATERS或公共属性...简单的例子(使用一个公共属性):

interface ISomeFactory 
{ 
    Something CreateSomething(object dataSource); 
} 

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

鉴于这些被注册这样的:

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

可以解决的实例这样的:

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

请记住,如果与Something的实例相关联的负担,里面的东西需要退役,你需要提供对工厂的适当Release方法为好。

+0

如果它的构造函数的参数是,但如果我想通过构造函数以外的其他东西来提供它呢?正如你在我的例子中看到的那样,我明确地没有在ViewModel类中指定一个构造函数依赖关系。 – Marius 2011-06-14 13:42:07

+1

我改变了这个例子来展示一个对象如何传递给工厂,允许它在解析时被设置为公共属性。这更像你想要实现的目标吗? – mookid8000 2011-06-14 19:49:37

+0

不错,不知道TypedFactoryFacility对于属性很聪明。我已更新我的示例以更清楚地表明我的意图。对不起,我不清楚的例子,但至少我学到了一些新的:-) – Marius 2011-06-15 05:47:08