我正在尝试使用ASP.NET Core 2.2 IServiceCollection
将依赖项注入构建到ASP.NET MVC(在完整的.NET Framework 4.7中)应用程序中。原因是我有一个使用ASP.NET Core构建的api项目,并使用Entity Framework Core,所以我希望Web应用程序(mvc)和api(core)都使用相同的框架(EF Core)。
我现在遇到的问题是AddScoped
好像在使用Singleton
一样正常工作(即,每次发出Web请求时都使用相同的dbcontext
)>
您能给我一个提示,如何告诉IServiceCollection
使用基于ASP.NET MVC的请求范围而不是.NET Core吗?
答案 0 :(得分:0)
使用每个请求的自定义范围解决:
protected void Application_BeginRequest(object sender, EventArgs e)
{
Context.Items.Add("serviceScope", Startup.Provider.CreateScope());
}
protected void Application_EndRequest(object sender, EventArgs e)
{
var serviceScope = Context.Items["serviceScope"] as IServiceScope;
serviceScope?.Dispose();
}
和
public class DotNetCoreDependencyResolver : IDependencyResolver
{
private readonly IServiceProvider _serviceProvider;
private readonly IDependencyResolver _oldDependencyResolver;
public DotNetCoreDependencyResolver(IServiceProvider serviceProvider,
IDependencyResolver oldDependencyResolver)
{
_serviceProvider = serviceProvider;
_oldDependencyResolver = oldDependencyResolver;
}
public object GetService(Type serviceType)
{
var serviceScope = HttpContext.Current.Items["serviceScope"] as IServiceScope;
return serviceScope?.ServiceProvider?.GetService(serviceType)
?? _serviceProvider.GetService(serviceType)
?? _oldDependencyResolver.GetService(serviceType);
}
public IEnumerable<object> GetServices(Type serviceType)
=> _oldDependencyResolver.GetServices(serviceType);
}
在Startup.cs
Provider = services.BuildServiceProvider();
DependencyResolver.SetResolver(new DotNetCoreDependencyResolver(Provider, DependencyResolver.Current));