在ASP.NET MVC中使用ASP.NET Core IServiceCollection

时间:2019-12-26 14:16:05

标签: c# asp.net-mvc asp.net-core

我正在尝试使用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吗?

1 个答案:

答案 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));