ASP.NET Core中的IServiceProvider

Sam*_*Sam 29 c# dependency-injection asp.net-core

我开始学习ASP.NET 5(vNext)中的更改,但无法找到如何获取IServiceProvider,例如在"Model"的方法中

public class Entity 
{
     public void DoSomething()
     { 
           var dbContext = ServiceContainer.GetService<DataContext>(); //Where is ServiceContainer or something like that ?
     }
}
Run Code Online (Sandbox Code Playgroud)

我知道,我们在启动时配置服务,但所有服务集合还是IServiceProvider?

Jai*_*ill 50

您必须引入Microsoft.Extensions.DependencyInjection命名空间才能访问泛型

GetService<T>();
Run Code Online (Sandbox Code Playgroud)

应该使用的扩展方法

IServiceProvider 
Run Code Online (Sandbox Code Playgroud)

另请注意,您可以直接将服务注入ASP.NET 5中的控制器.请参阅下面的示例.

public interface ISomeService
{
    string ServiceValue { get; set; }
}

public class ServiceImplementation : ISomeService
{
    public ServiceImplementation()
    {
        ServiceValue = "Injected from Startup";
    }

    public string ServiceValue { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

Startup.cs

public void ConfigureService(IServiceCollection services)
{
    ...
    services.AddSingleton<ISomeService, ServiceImplementation>();
}
Run Code Online (Sandbox Code Playgroud)

HomeController的

using Microsoft.Extensions.DependencyInjection;
...
public IServiceProvider Provider { get; set; }
public ISomeService InjectedService { get; set; }

public HomeController(IServiceProvider provider, ISomeService injectedService)
{
    Provider = provider;
    InjectedService = Provider.GetService<ISomeService>();
}
Run Code Online (Sandbox Code Playgroud)

这两种方法都可用于访问服务.Startup.cs的附加服务扩展

AddInstance<IService>(new Service())
Run Code Online (Sandbox Code Playgroud)

一直给出一个实例.您负责初始对象创建.

AddSingleton<IService, Service>()
Run Code Online (Sandbox Code Playgroud)

创建单个实例,它就像一个单例.

AddTransient<IService, Service>()
Run Code Online (Sandbox Code Playgroud)

每次注入时都会创建一个新实例.

AddScoped<IService, Service>()
Run Code Online (Sandbox Code Playgroud)

在当前HTTP请求范围内创建单个实例.它等效于当前范围上下文中的Singleton.

2018年10月18日更新

请参阅:aspnet GitHub - ServiceCollectionServiceExtensions.cs


Ant*_*ton 0

不要让您的服务内联,而是尝试将其注入到构造函数中。

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddTransient(typeof(DataContext));
    }
}

public class Entity
{
    private DataContext _context;

    public Entity(DataContext context)
    {
        _context = context;
    }

    public void DoSomething()
    {
        // use _context here
    }
}
Run Code Online (Sandbox Code Playgroud)

我还建议阅读其含义AddTransient,因为它将对应用程序共享 DbContext 实例的方式产生重大影响。这是一种称为依赖注入的模式。需要一段时间才能习惯,但一旦习惯了,你就再也不想回去了。