Castle Windsor зарегистрирует универсальный интерфейс и косвенно получит все зарегистрированные экземпляры наследования от него. - PullRequest
3 голосов
/ 15 октября 2010

У меня есть следующая структура -

public interface IBaseInterface<T>
{
}

public interface IChildInterface1<Class1> : IBaseInterface<Class1>
{
}

public interface IChildInterface2<Class2> : IBaseInterface<Class2>
{
}

public class ImplementationClass1 : IChildInterface1<Class1>
{
}

public class ImplementationClass2 : IChildInterface2<Class2>
{
}

Я хочу зарегистрировать все типы в сборке, которые прямо или косвенно реализуют IBaseInterface, поэтому я хочу иметь возможность регистрировать ExecutionClass1 и PracticeClass2 с учетом IBaseInterface.И затем я хочу получить любой конкретный тип на основе определения универсального типа классов ChildInterface.

Я регистрирую типы, подобные этому -

container.Register(
    AllTypes.FromAssemblyContaining<Class1>()
            .BasedOn(typeof(IBaseInterface<>))
            .WithService.Base()
            .Configure(c => c.LifeStyle.Transient)
     );

, а затем разрешаю тип, используя

var impl = container.Resolve(typeof(IChildInterface1<>))

Я ожидал, что это даст мне экземпляр реализацииClass1, однако я получаю сообщение об ошибке -

Не найдено ни одного компонента для поддержки службы IChildInterface`1

Может кто-нибудь выяснитьчто я делаю неправильно, это даже допустимый сценарий, который я пытаюсь предпринять?

Это весь мой код -

using Castle.MicroKernel.Registration;

namespace complexresolutionioc
{
  class Program
  {
    static void Main(string[] args)
    {
      var container = new Castle.Windsor.WindsorContainer();

      container.Register(
        AllTypes.FromAssemblyContaining<Class1>()
              .BasedOn(typeof(IBaseInterface<>))
              .WithService.AllInterfaces()
              .Configure(c => c.LifeStyle.Transient)
     );

      var thisWorks = container.Resolve<IChildInterface1<Class2>>();
    }
  }

  public interface IBaseInterface<T>
  {
  }

  public interface IChildInterface1<Class1> : IBaseInterface<Class1>
  {
  }

  public interface IChildInterface2<Class2> : IBaseInterface<Class2>
  {
  }

  public class ImplementationClass1 : IChildInterface1<Class1>
  {
  }

  public class ImplementationClass2 : IChildInterface2<Class2>
  {
  }

  public class Class1 { }
  public class Class2 { }

}

дает мне эту ошибку -

НетКомпонент для поддержки службы complexresolutionioc.IChildInterface1`1 [[complexresolutionioc.Class2, complexresolutionioc, Версия = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null]] был найден в Castle.MicroKernel.DefaultKernel.Resolve (Тип службы) в c:\ TeamCity \ buildAgent \ work \ 1ab5e0b25b145b19 \ src \ Castle.Windsor \ MicroKernel \ DefaultKernel_Resolve.cs: строка 172 в Castle.Windsor.WindsorContainer.Resolve (Служба типов) в c: \ TeamCity \ buildAgent \ work \ 1ab5e0b25b145b19 \ src \ Castle.Windsor \ Windsor \ WindsorContainer.cs: строка 889 в Castle.Windsor.WindsorContainer.ResolveT в c: \ TeamCity \ buildAgent \ work\ 1ab5e0b25b145b19 \ src \ Castle.Windsor \ Windsor \ WindsorContainer.cs: строка 978 в complexresolutionioc.Program.Main (String [] args) в C: \ MyDev \ complexresolutionioc \ complexresolutionioc \ Program.cs: строка 21

-ilias

1 Ответ

1 голос
/ 16 октября 2010

Вам необходимо предоставить закрытый универсальный тип, который вы хотите разрешить:

var thisWorks = container.Resolve<IChildInterface1<Class2>>();
...