2011-06-14 22 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