首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在ASP.NET MVC中使用ASP.NET核心IServiceCollection

在ASP.NET MVC中使用ASP.NET核心IServiceCollection
EN

Stack Overflow用户
提问于 2019-12-26 22:16:06
回答 1查看 577关注 0票数 1

我正在尝试使用ASP.NET Core2.2MVC将依赖注入构建到ASP.NET IServiceCollection (在完整的.NET Framework4.7上)应用程序中。原因是我有一个使用ASP.NET核心构建的应用程序接口项目,并使用实体框架核心,所以我希望web应用程序(mvc)和应用程序接口(核心)都使用相同的框架(EF核心)。

我现在遇到的问题是,AddScoped似乎就像我使用Singleton一样工作(即每次我发出web请求时,都会使用相同的dbcontext )

你能给我一个提示如何告诉IServiceCollection使用基于ASP.NET MVC的请求作用域而不是.NET核心作用域吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-28 20:54:50

使用每个请求的自定义作用域解决:

代码语言:javascript
运行
复制
    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();
    }

代码语言:javascript
运行
复制
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中

代码语言:javascript
运行
复制
 Provider = services.BuildServiceProvider();
 DependencyResolver.SetResolver(new DotNetCoreDependencyResolver(Provider, DependencyResolver.Current));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59489648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档