我有以下带有泛型类型参数的类。
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>());
谁能告诉我我在第一个版本中做错了什么,或者我如何改进第二个版本?