2014-07-04 66 views
2

類:城堡溫莎先進的工廠登記

public class SomeClass{ 
    public SomeClass(IBlabla bla, string name){ 
     //.... 
    } 
} 

我可以寫工廠:

public class SomeClassFactory{ 
public SomeClassFactory(IBlabla bla){ 
     //.... 
    } 
    public SomeClass Create(string name){return new SomeClass(_bla, name)} 
} 

並與之共存。但是我想知道,是否有任何解決方案可以在沒有這種明顯的工廠實現的情況下執行此操作,與.AsFactory()的工作方式相同,但帶有額外的參數?

回答

2

絕對有可能,你甚至可以通過Castle中的typed factories來實現。這裏是如何:

鑑於你的基類:

public interface IBlabla 
{ 
} 

public class Blabla : IBlabla 
{ 
} 

public class SomeClass 
{ 
    public string Name { get; set; } 
    public IBlabla Blabla { get; set; } 
    public SomeClass(IBlabla bla, string named) 
    { 
     Blabla = bla; 
     Name = named; 
    } 
} 

,你可以創建一個通用的工廠在其構造函數string named元素:

public interface IFactory 
{ 
    T Build<T>(string named); 
} 

無需任何實現,你是將使用一個工具,這將創建一個由Castle備份的工廠的自動實現:

// container 
var container = new Castle.Windsor.WindsorContainer(); 
// factory facility, needed to add behavior 
container.AddFacility<TypedFactoryFacility>(); 
// let's register what we need 
container.Register(
     // your factory interface 
     Component.For<IFactory>().AsFactory(), 
     // your IBlabla 
     Component.For<IBlabla>().ImplementedBy<Blabla>(), 
     // component, you could register against an interface 
     Component.For<SomeClass>().ImplementedBy<SomeClass>() 
    ); 
// shazam, let's build our SomeClass 
var result = container.Resolve<IFactory>().Build<SomeClass>("bla?"); 

它爲什麼有效?當經過一個打字的工廠時,Castle會嘗試傳遞被解析的對象所有傳遞給工廠調用的參數。因此named參數給出SomeClass的構造函數。通過Castle的標準行爲解決了IBlabla

你來了,工廠沒有任何實現整潔:d

+0

謝謝,這是非常有益的,但是需要有幾個測試必須補充一點,在構造函數的名稱和創建方法應該是完全一樣的,怎麼在其他情況 - 它會失敗。 –

+0

我不確定我是否理解,但您可以通過比較傳遞的參數和生成的對象名稱來測試工廠,或者您可以依靠城堡測試自己,您應該在這裏找到它們:https://github.com /castleproject/Windsor/tree/master/src/Castle.Windsor.Tests/Facilities/TypedFactory – samy

+0

我的意思是,如果在ctor中插入字符串someName,那麼在Build中應該有「someName」,而不是「name」或「參數1" 。我測試過了。那是我的錯誤。非常感謝工作示例,這非常有幫助。 –