代码之家  ›  专栏  ›  技术社区  ›  Anthony Waqas Raja

can castle.windsor可以自动解析混凝土类型

  •  6
  • Anthony Waqas Raja  · 技术社区  · 15 年前

    我们正在评估国际奥委会为C项目提供的集装箱,包括Unity和Castle。温莎很突出。我喜欢Unity(Ninject和StructureMap也这样做)的一点是,对于那些显而易见如何构造它们的类型,不必在IOC容器中注册。

    在城堡里有办法吗?温莎?我对城堡公平吗?温莎说这不公平吗?是否有设计原因故意不这样做,或者这是一个疏忽,或者只是不被视为重要或有用?

    我知道 container.Register(AllTypes... 在温莎,但那不是完全一样的事情。它不是完全自动的,而且非常广泛。

    为了说明这一点,这里有两个修女测试通过Unity和Castle.Windsor做同样的事情。城堡。温莎一号失败了。:

    namespace SimpleIocDemo
    {
        using NUnit.Framework;
        using Castle.Windsor;
        using Microsoft.Practices.Unity;
    
        public interface ISomeService
        {
            string DoSomething();
        }
    
        public class ServiceImplementation : ISomeService
        {
            public string DoSomething()
            {
                return "Hello";
            }
        }
    
        public class RootObject
        {
            public ISomeService SomeService { get; private set; }
    
            public RootObject(ISomeService service)
            {
                SomeService = service;
            }
        }
    
        [TestFixture]
        public class IocTests
        {
            [Test]
            public void UnityResolveTest()
            {
                UnityContainer container = new UnityContainer();
                container.RegisterType<ISomeService, ServiceImplementation>();
                // Root object needs no registration in Unity
                RootObject rootObject = container.Resolve<RootObject>();
                Assert.AreEqual("Hello", rootObject.SomeService.DoSomething());
            }
    
            [Test]
            public void WindsorResolveTest()
            {
                WindsorContainer container = new WindsorContainer();
                container.AddComponent<ISomeService, ServiceImplementation>();
    
                // fails with exception "Castle.MicroKernel.ComponentNotFoundException: 
                // No component for supporting the service SimpleIocDemo.RootObject was found"
                // I could add
                // container.AddComponent<RootObject>();
                // but that approach does not scale
                RootObject rootObject = container.Resolve<RootObject>();
                Assert.AreEqual("Hello", rootObject.SomeService.DoSomething());
            }
        }
    }
    
    1 回复  |  直到 6 年前
        1
  •  6
  •   Krzysztof Kozmic    6 年前

    温莎不支持这一点,这是一个深思熟虑的决定。见 this answer 了解更多详细信息。

    但是,可以很容易地扩展更高版本以支持这种情况,方法是按照请求延迟注册未注册的组件。 你必须执行 ILazyComponentLoader 接口,它将占用大约5行代码。见 here 举个例子。

    尽管我在2018年的建议和2009年的建议是一样的-除非在 非常 在特定情况下, 非常 选择这种方法而不是其他方法的充分理由