繁体   English   中英

温莎城堡高级工厂注册

[英]Castle Windsor advanced factory registration

上课:

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()一样,但是没有其他明显的工厂实现方式呢?

绝对有可能,而且您甚至可以通过在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 namedstring 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM