2009-11-04 77 views
0

我想註冊一個類似IRequestHandler的類型[T]]將由GenericTestRequestHandler`1 [T]實現,但我目前從溫莎得到一個錯誤「城堡.MicroKernel.ComponentNotFoundException:沒有用於支持服務的組件「是否支持此類操作?或者,它是從扶持產品寄存器(Component.For(typeof運算(IList的相去甚遠<>)。ImplementedBy(typeof運算(列表<>)))解決在溫莎城堡通用參數通用

下面

是斷裂試驗的一個例子。 //// //////////////////////////////////////////////////

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

我覺得這裏的問題是,業務類型爲泛型類型定義,而實現類型以下測試全部通過,這證明這一點:

[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<>>

希望這是明確的......

+0

毛是死了。 +1票 – eduncan911 2009-11-05 02:41:33