我正在尝试使用ASP.NET Core2.2MVC将依赖注入构建到ASP.NET IServiceCollection
(在完整的.NET Framework4.7上)应用程序中。原因是我有一个使用ASP.NET核心构建的应用程序接口项目,并使用实体框架核心,所以我希望web应用程序(mvc)和应用程序接口(核心)都使用相同的框架(EF核心)。
我现在遇到的问题是,AddScoped
似乎就像我使用Singleton
一样工作(即每次我发出web请求时,都会使用相同的dbcontext
)
你能给我一个提示如何告诉IServiceCollection
使用基于ASP.NET MVC的请求作用域而不是.NET核心作用域吗?
发布于 2019-12-28 20:54:50
使用每个请求的自定义作用域解决:
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));
https://stackoverflow.com/questions/59489648
复制相似问题