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
不要让您的服务内联,而是尝试将其注入到构造函数中。
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 实例的方式产生重大影响。这是一种称为依赖注入的模式。需要一段时间才能习惯,但一旦习惯了,你就再也不想回去了。