Делает поддержку Виндзора Замка ForwardedTypes через конфигурацию XML

Если вы оставите файл Realm в каталоге Documents, то, если пользователь выполнит резервное копирование iCloud или iTunes, файл будет скопирован. Однако все это означает, что если пользователь решит перейти на новое устройство и выполнить восстановление с использованием образа резервной копии старого устройства, тогда файл Realm будет восстановлен. Если пользователь удалит приложение со старого устройства до этого, резервная копия iCloud также будет удалена и файл Realm.

9
задан Bittercoder 8 November 2008 в 03:51
поделиться

1 ответ

[Обновление] Это является теперь возможным в Виндзоре 2.1 или более новым. См. документацию для синтаксиса здесь.


Эта опция не была реализована в интерпретаторе XML на данный момент.. однако не трудно добавить поддержку его через средство (очевидно, эта техника также полезна, желая добавить другие опции, отсутствующие в существующем синтаксическом анализаторе конфигурации).

Так прежде всего мы добавляем средство, которое обнаружит, когда обработчик будет создан для типа, и в то же время зарегистрирует любой из переданных сервисов, таким образом, они указывают на существующий обработчик:

public class HandlerForwardingFacility : AbstractFacility
{
  IConversionManager conversionManager;

  protected override void Init()
  {
    conversionManager = (IConversionManager)Kernel.GetSubSystem(SubSystemConstants.ConversionManagerKey);
    Kernel.HandlerRegistered += new HandlerDelegate(Kernel_HandlerRegistered);      
  }

  void Kernel_HandlerRegistered(IHandler handler, ref bool stateChanged)
  {
    if (handler is ForwardingHandler) return;

    var model = handler.ComponentModel;

    if (model.Configuration == null) return;

    var forward = model.Configuration.Children["forward"];
    if (forward == null) return;

    foreach (var service in forward.Children)
    {
      Type forwardedType = (Type)conversionManager.PerformConversion(service, typeof (Type));
      Kernel.RegisterHandlerForwarding(forwardedType, model.Name);
    }
  }
}

И затем конечно, мы должны использовать это в коде для этого примера, я собираюсь иметь компонент утки/собаки мутанта, который поддерживает два отдельных сервиса - IDuck и IDog:

public interface IDog
{
  void Bark();
}

public interface IDuck
{
  void Quack();
}

public class Mutant : IDog, IDuck
{
  public void Bark()
  {
    Console.WriteLine("Bark");
  }

  public void Quack()
  {
    Console.WriteLine("Quack");
  }
}

Теперь на самом деле настраивать контейнер:

 <castle>
  <facilities>
    <facility id="facility.handlerForwarding" type="Example.Facilities.HandlerForwardingFacility, Example" />
  </facilities>
  <components>
    <component id="mutant" service="Example.IDog, Example" type="Example.Mutant, Example">
      <forward>
        <service>Example.IDuck, Example</service>
      </forward>
    </component>
  </components>
</castle>

И теперь мы можем счастливо выполнить тест как это:

  WindsorContainer container = new WindsorContainer(new XmlInterpreter());

  var dog = container.Resolve<IDog>();
  var duck = container.Resolve<IDuck>();

  Assert.AreSame(dog, duck);

Надеюсь, это поможет.

10
ответ дан 4 December 2019 в 21:13
поделиться
Другие вопросы по тегам:

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