Может Рокироваться. Виндзор делает автоматическое разрешение конкретных типов

Мы оцениваем контейнеры МОК для проектов C#, и и Единица и Замок. Виндзор выделяется. Одна вещь, что мне нравится приблизительно Единица (NInject и StructureMap также делают это) состоит в том, что типы, где очевидно, как создать их, не должны быть зарегистрированы в Контейнере МОК.

Есть ли способ сделать это в Замке. Виндзор? Я справедлив для Рокировки. Виндзор, чтобы сказать, что это не делает этого? Существует ли причина дизайна для сознательно не, делают это, или действительно ли это - контроль, или просто не рассматриваемое как важный или полезный?

Я знаю container.Register(AllTypes... в Виндзоре, но это - не совсем то же самое. Это не совсем автоматически, и это очень широко.

Чтобы проиллюстрировать тезис, вот, два тестовых выполнения NUnit того же самого через Единицу и Замок. Виндзор. Замок. Виндзор каждый перестал работать.:

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());
        }
    }
}
6
задан alexandrul 18 May 2010 в 05:26
поделиться

1 ответ

Виндзор не поддерживает это из коробки, и это преднамеренное решение. См. Этот ответ для более подробной информации.

Однако более поздние версии могут быть действительно легко расширены для поддержки этого сценария, лениво регистрация не зарегистрированных компонентов, поскольку они запрашиваются. Вам придется реализовать Интерфейс IlazyComponentloader , который займет как 5 строк кода. Смотри здесь для примера.

Несмотря на то, что мое предложение в 2018 году такое же, как и в 2009 году - не делайте этого, если только в очень специфические сценарии, где у вас есть очень Подход по альтернативам

6
ответ дан 17 December 2019 в 02:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: