通过类型名称进行依赖注入

时间:2018-11-13 18:25:47

标签: c# .net reflection dependency-injection autofac

在我的示例中,我使用了Autofac(没有必要):

var r = builder.RegisterType<Helper>().As<IHelper>(); // usual using

我想做的就是能够像这样注册类型:

string name1 = "Helper";

string name2 = "IHelper";

var r = builder.RegisterType<GetTypeFromName(name1)>().As<GetTypeFromName(name2)>();

反射魔法有可能吗?

3 个答案:

答案 0 :(得分:1)

您将必须创建一种机制来“弄清楚”要注册的具体类型以及如何公开它们(AutoFac中的As部分)。以下是如何使用System.Type注册的示例,因此缺少的部分是您自己获取System.Type的地方。

// get your Type(s)
Type concreteType = typeof(Helper);
Type asType = typeof(IHelper);

// Autofac registration call
builder.RegisterType(concreteType).As(asType);

如您在上面的代码中看到的,您应该调用RegisterTypeAs方法的非通用版本。 (无论如何,通用版本实际上只是调用了这些。)

答案 1 :(得分:1)

通常,要解析类型名称,您不仅需要提供类名称,还需要提供更多信息。所以我猜答案是“不完全”。

将字符串映射到类型的方法是Type.GetType,在此处记录:https://docs.microsoft.com/en-us/dotnet/api/system.type.gettype?view=netframework-4.7.2

如您所见,在真空中我们不能说"Helper""IHelper"就足够了。您可能可以使用名称空间限定的类名来获得。 (当然,Helper使用“硬编码”语法的原因是,编译器可以利用using语句来确定Helper的含义。该选项不会GetType试图在运行时理解字符串时无效。)

如果您可以提供自定义解析器,也许可以使其完全按照您的描述运行。

答案 2 :(得分:1)

如果能够为要注册的类型获取Type对象,则可以使用RegisterType方法的不同重载将其传递给Autofac,如下所示:

var type = Assembly.LoadFrom(path).GetType(typeName);
builder.RegisterType(type);