【发布时间】:2018-09-13 09:42:33
【问题描述】:
我有在主项目中引用的 c# 库。图书馆
- 获取主项目程序集;
- 使用
System.Reflection检索所有类型; - 应该使用
Activator.CreateInstance创建类型(我不确定这是不是最好的方法)。
库对主项目一无所知,只有一个可以通过反射获得的元数据。 如何解决依赖关系?
private readonly Assembly _assembly;
public Injector()
{
_assembly = Assembly.GetEntryAssembly();
}
public List<string> GetTypes()
{
return _assembly
.GetTypes()
.Select(x => x.FullName)
.ToList();
}
public object GetType(string typeName)
{
Type type = _assembly
.GetTypes()
.First(x => x.FullName == typeName);
object instance = Activator.CreateInstance(type);
return instance;
}
可能的问题:不同的 IoC 容器(第三方库,自己编写的)。
在不强制用户提供大量设置的情况下,处理此问题并保持库更加自动化的最佳方法是什么?如果不可能,您能否提供任何其他解决方案?谢谢。
编辑: 如何在Activator.CreateInstance 中为实例提供依赖关系或直接从主(源)项目创建实例?应该允许创建包含在主项目中的任何实例。是的,主项目也对库一无所知。因此,希望在主项目中进行最少的代码更改。
编辑 2: 该库不会在源项目中使用,它将有自己的 UI 界面。例如Swagger API
【问题讨论】:
-
@MortenBork,不,这不是重复的。
-
您为什么不使用已建立的双容器之一?当您仅注册程序集时,有些可用于注册所有公共类型。但这并不是很干净,特别是如果你想为一个接口注册不同的实现。
-
@Rabban,如果我理解正确的话,我不能使用已建立的双容器之一,因为库不知道使用什么容器
-
这是你要实现的一些插件系统吗?您也可以使用 di 容器来执行此操作,而无需事先了解插件。 Simple Injector 支持这种行为:Plugin registration.
标签: c# .net reflection dependency-injection inversion-of-control