在构造函数之外的DI

时间:2017-01-11 17:56:23

标签: c# dependency-injection .net-core

我们可以在.NET Core中动态请求依赖吗?类似的东西:

public void MyMethod() {
    var dep = DependencyMagic.Instantiate<MyDependency>();
}

我对第三方解决方案不感兴趣,但如果完成答案,请随时对它们发表评论。我只是使用.NET Core内置的DI。我无法使用Activator,因为我不知道依赖关系构造函数的签名是什么。

1 个答案:

答案 0 :(得分:1)

您需要使用System.IServiceProvider的实例。它定义了下一个方法:

// Gets the service object of the specified type.
public object GetService(Type serviceType)

在.NET Core this中也提供了扩展方法:

public static T GetService<T>(this IServiceProvider provider)

Microsoft.Extensions.DependencyInjection.IServiceScope.ServiceProviderdefinition)是IServiceProvider接口的默认实现。

如果您的应用程序是ASP.NET Core,那么使用HttpContext可以检索IServiceProvider实例。来自official文档:

  

来自HttpContext的ASP.NET请求中可用的服务通过RequestServices集合公开。

enter image description here

  

请求服务代表您配置和请求的服务,作为您的应用程序的一部分。当您的对象指定依赖项时,RequestServices中的类型会满足这些类型,而不是ApplicationServices。

     

通常,您不应该直接使用这些属性,而是更喜欢通过类的构造函数请求类所需的类,并让框架注入这些依赖项。这会产生更容易测试的类(请参阅测试),并且更松散地耦合。