2

我有以下带有泛型类型参数的类。

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

DataString 是一个抽象类,每当我的应用程序创建 ContentService 的实例时,我希望 Structure Map 使用具体的实现 (XmlDataString)。当我这样做时,结构图已经在注入 IEnvironment 和 ILogger 的具体实现:

版本 1:

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

...但是当我逐步执行时,ContentService 是使用 DataString 类型参数创建的,而不是 XmlDataString。我在 web.config 中有这三个设置默认实例的条目:

  • IEnvironment -> 测试环境
  • ILogger -> Log4NetLogger
  • 数据字符串-> XmlDataString

Structure Map 站点对泛型有说法,但我似乎无法将该示例与我的实际问题联系起来。

这种方法有效,但我失去了构造函数参数的自动连接,它看起来很丑:版本 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>());

谁能告诉我我在第一个版本中做错了什么,或者我如何改进第二个版本?

4

1 回答 1

1

首先,当您编写 时ObjectFactory.GetInstance<ContentService<DataString>>(),您无法ContentService<XmlDataString>返回,因为这是一种不同的、不兼容的类型。

但似乎你真的想要IContentService,所以写下:ObjectFactory.GetInstance<IContentService>()。这将返回IContentService您注册的实现,因此您应该这样做:ContentService<XmlDataString>注册IContentService. XmlDataString您注册的事实DataString与此无关。

If you have problems representing the generic type ContentService<XmlDataString> in web.config, I think using the .Net representation of generic types (and not that of C#) should work. In your case, that would be something like ContentService`1[[XmlDataString]], probably with added namespaces and possibly assemblies too.

于 2012-04-04T17:09:06.823 回答