絕對有可能,你甚至可以通過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
謝謝,這是非常有益的,但是需要有幾個測試必須補充一點,在構造函數的名稱和創建方法應該是完全一樣的,怎麼在其他情況 - 它會失敗。 –
我不確定我是否理解,但您可以通過比較傳遞的參數和生成的對象名稱來測試工廠,或者您可以依靠城堡測試自己,您應該在這裏找到它們:https://github.com /castleproject/Windsor/tree/master/src/Castle.Windsor.Tests/Facilities/TypedFactory – samy
我的意思是,如果在ctor中插入字符串someName,那麼在Build中應該有「someName」,而不是「name」或「參數1" 。我測試過了。那是我的錯誤。非常感謝工作示例,這非常有幫助。 –