2011-01-13 1 views
1

Надеюсь, что название имеет хоть какой-то смысл.Зарегистрируйте в Виндзоре открытый общий тип компонента для общего обслуживания открытого типа типа

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

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

Артур,

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

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

+0

Теперь я вспоминаю чтение вашей статьи и Джимми Миллера. Спасибо, это должно сработать. – Artur

0

IIRC Windsor требует общих определений типов (типов, т.е. вы можете позвонить MakeGenericType() в).

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^