温莎城堡高级工厂登记

本文关键字:工厂 高级 城堡 | 更新日期: 2023-09-27 18:11:32

拥有:

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

我可以写factory:

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

并接受它。但我想知道,有没有任何解决方案可以做到这一点,没有这样明显的工厂实现,在相同的方式。asfactory()的工作,但有额外的参数?

温莎城堡高级工厂登记

绝对可能,您甚至可以不通过Castle中的类型化工厂实现。方法如下:

给定你的基类:

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