2012-04-03 62 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