0

1[GenericTestRequestGenericTestRequestHandler`1[T]によって実装されるIRequestHandler1[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 に答える