2011-01-13 93 views
1

我希望標題至少有一定意義。在Windsor註冊一個開放的泛型類型組件,用於開放泛型類型的通用服務

我有如下代碼的情況。測試通過,但我想註冊

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

阿圖爾,

什麼你問的是半封閉泛型支持和毛提到的有沒有.NET框架中的API來支持這些。你可能會破解它,以便它在大多數情況下都能正常工作(Windsor的問題跟蹤器中有一張支持這種情況的門票),但是API中沒有建立下降意味着使其工作將是一項重大的工作。

您可以看看at this blogpost of mine,它解決了特定組件的問題。也許這將足以滿足您的需求。

+0

現在我記得閱讀你的文章和吉米·米勒的。謝謝,這應該工作。 – Artur 2011-01-14 15:59:04

0

IIRC溫莎需要泛型類型定義(即類型,您可以致電MakeGenericType())。 (僞代碼,甚至不編譯)不是泛型類型定義,因爲自由類型參數是嵌套的,所以不能調用MakeGenericType()。

請參閱http://www.ideone.com/0WsMZ進行一些小測試,以便澄清這一點。又見MSDN page about Type.IsGenericType,它定義「泛型類型定義」,「開放式泛型類型」等

相關問題