Зарегистрируйте в Виндзоре компонент открытого универсального типа для универсального сервиса открытого универсального типа - PullRequest
1 голос
/ 13 января 2011

Надеюсь, название имеет хоть какой-то смысл.

У меня ситуация как в коде ниже. Тест проходит, но я хотел бы зарегистрироваться

GenericCommandHandler<> 

как открытый универсальный тип как реализация для

IHandler<GenericCommand<>>

Я могу жить с вещью ниже, потому что количество типов, данных GenericCommandHandler, ограничено, и я могу зарегистрировать их все по отдельности, но хотел бы что-то более «автоматизированное».

using Castle.MicroKernel.Registration;
using Castle.Windsor;
using NUnit.Framework;

[TestFixture]
public class Class1
{
   [Test]
   public void t()
   {
      using( var container = new WindsorContainer() )
      {
         // HOW TO REGISTER IT AS OPEN GENERIC TYPE?
         container.Register(
            Component.For<IHandler<GenericCommand<object>>>()
               .ImplementedBy<GenericCommandHandler<object>>() );

         var handler = container.Resolve<IHandler<GenericCommand<object>>>( );
      }
   }
}

public interface IHandler<TCommand>
{
   void Handle(TCommand o);
}

public class GenericCommand<T>
{
}

public class GenericCommandHandler<T> : IHandler<GenericCommand<T>>
{
   public void Handle( GenericCommand<T> o )
   {
   }
}

Ответы [ 2 ]

2 голосов
/ 14 января 2011

Артур,

Вы запрашиваете поддержку полузакрытых дженериков, и, как отметил Маурисио, в .NET Framework нет API для их поддержки.Вы вроде бы могли взломать это, так что это работает в большинстве случаев (в трекере ошибок Виндзора открыт билет для поддержки этого), но отсутствие встроенного API спуска означало бы, что заставить его работать будет значительным усилием.

Вы можете посмотреть моего поста моего блога , в котором рассматривается проблема конкретного компонента.Возможно, этого будет достаточно для ваших нужд.

0 голосов
/ 13 января 2011

IIRC Windsor требуются определения общих типов (т. Е. Типы, для которых вы можете вызвать MakeGenericType ()).

IHandler<GenericCommand<>> (псевдокод, даже не компилируется) не является определением универсального типа, вы не можете вызвать для него MakeGenericType (), потому что параметр свободного типа вложен.

См. http://www.ideone.com/0WsMZ для небольшого теста, который должен прояснить это. См. Также страницу MSDN о Type.IsGenericType , который определяет «определение универсального типа», «открытые универсальные типы» и т. Д.

...