关于.net:Windsor容器:在Code vs Xml中注册内容

关于.net:Windsor容器:在Code vs Xml中注册内容

Windsor Container: Registering things in Code vs Xml

从我所读到的有关Windsor / Microkernel的内容来看,从理论上讲,可以使用带代码的xml文件来完成您可以做的所有事情。事实上-如果我错了,请纠正我-温莎层的主要贡献似乎是为Microkernel已经可以做的事情添加xml配置。

但是,最近我一直在努力寻找如何在代码中实现一些稍微复杂的功能(即,如何分配默认的构造函数参数值)。现在,当我要在生产版本中使用xml时,我正在为测试注册代码中的组件,这变得很成问题。他们文档的不幸状态以及我能找到的唯一文章都集中在xml注册这一事实并没有帮助。

有谁知道列出如何在代码中注册内容的资源(最好使用xml等效语言)?除此以外,还有谁能简单地知道一个开放源代码/示例项目,其中Castle Windsor / Microkernel大量使用了非XML?


我总是发现看单元测试是学习如何使用开源项目的最佳方法。 Castle具有流畅的界面,可让您执行代码中的所有操作。 在WindsorDotNet2Tests测试案例中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[Test]
    public void ParentResolverIntercetorShouldNotAffectGenericComponentInterceptor()
    {
        WindsorContainer container = new WindsorContainer();
        container.AddComponent<MyInterceptor>();

        container.Register(
            Component.For<ISpecification>()
                .ImplementedBy<MySpecification>()
                .Interceptors(new InterceptorReference(typeof(MyInterceptor)))
                .Anywhere
            );
        container.AddComponent("repos", typeof(IRepository<>), typeof(TransientRepository<>));

        ISpecification specification = container.Resolve<ISpecification>();
        bool isProxy = specification.Repository.GetType().FullName.Contains("Proxy");
        Assert.IsFalse(isProxy);
    }

有关更多信息,请查看ComponentRegistrationTestCase和AllTypesTestCase

还有一个DSL可以做到这一点,这是我的首选,因为它确实简化了事情并提供了许多易于扩展的特性。 DSL称为Binsor,您可以在此处了解更多信息:http://www.ayende.com/Blog/archive/7268.aspx但是,同样,infor的最佳选择是单元测试。 这是binsor可能实现的代码示例:

1
2
for type in AllTypesBased of IController("Company.Web.Controller"):
    component type

这两行将注册继承IController接口到容器中的所有类型:D


推荐阅读