2011-01-13 5 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 프레임 워크의 API. 당신은 일종의 해킹을 할 수 있기 때문에 대부분의 경우 작동합니다 (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, 등

관련 문제