0

我正在尝试注册 IRequestHandler 1[GenericTestRequest1[T]] 之类的类型,它将由 GenericTestRequestHandler`1[T] 实现,但我目前从 Windsor 收到错误“Castle.MicroKernel.ComponentNotFoundException:没有支持服务的组件”这是支持的操作类型?或者它是否远离支持的寄存器( Component.For(typeof( IList<>).ImplementedBy( typeof( List<> ) ) )

下面是一个断裂测试的例子。///////////////////////////////////////// ////

public interface IRequestHandler{}

public interface IRequestHandler<TRequest> : IRequestHandler where TRequest : Request{} 

public class  GenericTestRequest<T> : Request{} 

public class GenericTestRequestHandler<T> : RequestHandler<GenericTestRequest<T>>{}

[TestFixture]
public class ComponentRegistrationTests{
   [Test]
   public void DoNotAutoRegisterGenericRequestHandler(){

var IOC = new Castle.Windsor.WindsorContainer();
var type = typeof( IRequestHandler<> ).MakeGenericType( typeof( GenericTestRequest<> ) );
IOC.Register( Component.For( type ).ImplementedBy( typeof( GenericTestRequestHandler<> ) ) );

var requestHandler = IoC.Container.Resolve( typeof(IRequestHandler<GenericTestRequest<String>>));

Assert.IsInstanceOf <IRequestHandler<GenericTestRequest<String>>>( requestHandler );
Assert.IsNotNull( requestHandler );
}
}
4

1 回答 1

4

我认为这里的问题是服务类型不是泛型类型定义,而实现类型. 以下测试全部通过,证明了这一点:

[Test]
public void ServiceIsNotGenericTypeDefinition() {
    var service = typeof(IRequestHandler<>).MakeGenericType(typeof(GenericTestRequest<>));
    Assert.IsFalse(service.IsGenericTypeDefinition);
}

[Test]
public void ImplementationIsGenericTypeDefinition() {
    var implementation = typeof (GenericTestRequestHandler<>);
    Assert.IsTrue(implementation.IsGenericTypeDefinition);
}

[Test]
[ExpectedException(typeof(InvalidOperationException))]
public void FillOpenGenericType() {
    var service = typeof(IRequestHandler<>).MakeGenericType(typeof(GenericTestRequest<>));
    service.MakeGenericType(typeof (string));
}

这是因为接口上实际打开的参数类型是“内部”类型,而不是“结果”类型。

所以这就像注册一个带有接口ICollection(不是泛型ICollection!)和实现类型的组件List<>。当您询问 Windsor 时ICollection,它不知道将什么类型参数应用于实现类型。

在您的情况下,情况更糟,因为您要求的IRequestHandler<GenericTestRequest<String>>是未真正注册的内容。(IRequestHandler<GenericTestRequest<>>

希望这很清楚...

于 2009-11-05T00:11:39.460 回答