2012-04-03 106 views
2

我有以下具有泛型類型參數的類。使用結構圖替換泛型類型參數中的抽象類型

public class ContentService<T> : IContentService where T : DataString, new() 
{  
    public ContentService(IEnvironment environment, 
          ILogger logger) 
    { 
     _environment = environment; 
     _logger = logger; 
    } 
... 
} 

DataString是一個抽象類,我想構造圖使用的具體實現(XmlDataString)每當我的應用程序創建的contentService的一個實例。結構地圖已經被注入IEnvironment和ILogger的具體實現時,我這樣做:

版本1:

_contentService = ObjectFactory.GetInstance<ContentService<DataString>>(); 

...但是當我步,是contentService的用DataString的類型參數,而不是創建XmlDataString。我在web.config中這三個條目設置默認實例:

  • IEnvironment - > TestEnvironment
  • ILogger - > Log4NetLogger
  • DataString - > XmlDataString

結構地圖網站有this要說泛型,但我似乎無法將這個例子與我的實際問題聯繫起來。

這種方法的工作原理,但我失去的構造函數的參數自動佈線,它看起來很醜陋: 版本2:

Type typeOfDataString = ObjectFactory.GetInstance<DataString>().GetType(); 
Type genericClass = typeof(ContentService<>); 
Type constructedClass = genericClass.MakeGenericType(typeOfDataString); 
_contentService = (IContentService)Activator.CreateInstance(constructedClass, 
      ObjectFactory.GetInstance<IEnvironment>(), 
      ObjectFactory.GetInstance<ILogger>()); 

誰能告訴我什麼,我做錯了第一版本,還是我可能會改進第二版本?

+0

如果你打電話'ObjectFactory.GetInstance ()'會發生什麼?如果這不起作用,您不能將IContentService→ContentService 添加到您的web.config中嗎? – svick 2012-04-04 01:15:33

+0

謝謝@svick,工作。我只是注入整個服務。我能做到這一點的代碼: 'x.For ()使用>();' ,但我一直沒能找出如何把在web.config中。 (編碼< & >不工作) – mafue 2012-04-04 16:36:08

回答

1

首先,當您編寫ObjectFactory.GetInstance<ContentService<DataString>>()時,無法獲得ContentService<XmlDataString>,因爲這是不同的不兼容類型。

但是看起來你實際上想要IContentService,所以請寫下:ObjectFactory.GetInstance<IContentService>()。這將返回您註冊的IContentService的實施,所以您應該這樣做:註冊ContentService<XmlDataString>IContentService。您有XmlDataString註冊爲DataString這一事實與此無關。

如果您在web.config中遇到代表泛型類型ContentService<XmlDataString>的問題,我認爲使用泛型類型(而不是C#)的.Net表示應該可以工作。在你的情況,這將是像ContentService`1[[XmlDataString]],可能添加了命名空間和可能的組件了。

+0

我試圖打破我的依賴關係,並分別注入他們,但我看到現在是沒有必要的。感謝你的回答! 只是爲了防止其他人在web.config中表示泛型類型,下面是對我有用的東西: '' – mafue 2012-04-04 17:59:00