.net核心在代码中的任何位置手动解析依赖关系

时间:2018-06-03 08:53:21

标签: .net-core

您知道如何在 .net核心中手动解决依赖关系吗? 像

这样的东西
DependencyResolver.Resolve<ISomeService>()

更新 我在一个没有注入的类中,我想从内部解决它,而不是在整个地方传递变量

2 个答案:

答案 0 :(得分:2)

ConfigureServices中添加您的依赖关系,如下所示

public void ConfigureServices(IServiceCollection services){
    //AddSingleton or AddTransient based on your requirements
    services.AddTransient<ISomeService, ConcreteService>();
}

在您的控制器或任何地方,在构造函数中添加IServiceProvider,如下所示:

using Microsoft.Extensions.DependencyInjection;

...

public class HomeController
{
  ...
  public HomeController(IServiceProvider serviceProvider)
  {
      var service = serviceProvider.GetService<ISomeService>();
  }
}

@Shazam,以下是基于您的评论的一些注意事项或建议:

  • 如果因为你可能没有这个类中的构造函数而无法注入,我建议在你的函数中添加一个参数并从外部传递已解析的依赖项

  • 另一个想法是添加静态属性并在ConfigureServices

  • 中初始化其值

例如:

public static class MyClass
{
    public static ISomeService MyServiceObj { set; get; }
    ....
}

ConfigureServices

   public void ConfigureServices(IServiceCollection services){
        services.AddTransient<ISomeService, ConcreteService>();
        MyClass.MyServiceObj = services.GetService<ISomeService>();
    }

希望这会有所帮助,请评价我的答案,或者如果您仍然有疑问,请给我发表评论

答案 1 :(得分:0)

Shazam,如果你需要在你的代码中使用该服务,请在启动类中注入它,然后在构造函数中自动解决它。就是这样。

在你的情况下可能是这样的:

在StartUp类中:

services.AddSingleton<ISomeService, SomeService>();

在课堂上(控制器可能是?):

public YourController(ISomeService someService)
        {...

然后你可以使用它。

我希望它有所帮助。