上课:
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()一样,但是有附加参数吗?
答案 0 :(得分:3)
绝对可能,你甚至可以通过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
的构造函数。 IBlabla
通过Castle的标准行为得到解决。
你有,没有任何实施的工厂很整洁:D