Windsor-Castle: зарегистрировать все типы в сборке, используя конфигурационный файл - PullRequest
4 голосов
/ 01 августа 2010

в коде я могу сделать что-то вроде этого:

container.Register(AllTypes.FromAssemblyNamed("AssemblyName"));

Могу ли я сделать то же самое, используя файл конфигурации "Windsor.Config" ???

Ответы [ 3 ]

18 голосов
/ 02 августа 2010

Ответ на ваш комментарий.

Существует также 3-й способ (в Windsor 2.5, в настоящее время в бета-версии 2 - окончательный выпуск ожидается очень скоро).

Выкаждый из ваших модулей может ссылаться на Windsor, и каждый модуль имеет свой собственный набор Установщиков.

Чем вы можете использовать новую возможность сканирования каталогов для установки компонентов из всех этих сборок:

// In your root assembly
var container = new WindsorContainer();
container.Install(   
   FromAssembly.This(),
   FromAssembly.InDirectory(new AssemblyFilter("Modules")),
   Configuration.FromAppConfig()
)

Кроме того, если у вас есть компоненты, имеющие одинаковую структуру, вы также можете зарегистрировать компоненты из нескольких сборок в одном установщике. Подробнее здесь.

container.Register(
   AllTypes.FromAssemblyInDirectory(new AssemblyFilter("Modules"))
      .Where(t=>t.Namespace.EndsWith(".Services"))
      .WithService.DefaultInterface()
);
1 голос
/ 01 августа 2010

Вы можете написать тривиальное средство для этого, например ::

AllTypesConfig.xml

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <facilities>
    <facility id="alltypes">
      <assemblies>
        <item>Castle.Core</item>
      </assemblies>
    </facility>
  </facilities>
</configuration>

Код:

public class AllTypesFacility : AbstractFacility {
    protected override void Init() {
        var asmList = FacilityConfig.Children["assemblies"].Children;
        foreach (var asm in asmList)
            Kernel.Register(AllTypes.FromAssemblyNamed(asm.Value).Pick());
    }
}


var container = new WindsorContainer(@"..\..\AllTypesConfig.xml");
container.AddFacility("alltypes", new AllTypesFacility());
container.Resolve<NullLogger>();

Если вам потребуется больше гибкости, будет все труднее представлять плавную конфигурацию в XML.

1 голос
/ 01 августа 2010

Я вполне уверен, что только с помощью свободно распространяемого API конфигурации вы можете настроить соглашения для своего приложения, чтобы при создании новых компонентов вам не требовалось регистрировать их по отдельности, как показывает ваш пример.

...