.NET Core 2.0 Autofac 注册类 InstancePerRequest 不起作用

标签 .net asp.net-core dependency-injection autofac

这是我的界面

public interface IMatchServices
{
    string MatchList();
}

在这里上课
public class MatchServices : IMatchServices
{
    public string MatchList() {

        return "test";
    }
}

Controller
public class SearchController : Controller
{
    private readonly IMatchServices matchservices;

    public SearchController(IMatchServices matchservices)
    {
        this.matchservices = matchservices;
    }

    [Route("matchlist")]
    public string MatchList() {

        return matchservices.MatchList();
    }
}

ConfigureService
public IServiceProvider ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    ContainerBuilder builder = new ContainerBuilder();
    builder.RegisterType<MatchServices>().As<IMatchServices>().SingleInstance();
    builder.Populate(services);
    var container = builder.Build();
    return container.Resolve<IServiceProvider>();
}

最后是错误(当我注册 InstancePerRequest 时):

Autofac.Core.DependencyResolutionException: Unable to resolve the type 'xxx.Services.MatchServices' because the lifetime scope it belongs in can't be located. The following services are exposed by this registration: - xxx.Interfaces.IMatchServices

Details ---> No scope with a tag matching 'AutofacWebRequest' is visible from the scope in which the instance was requested.

If you see this during execution of a web application, it generally indicates that a component registered as per-HTTP request is being requested by a SingleInstance() component (or a similar scenario). Under the web integration always request dependencies from the dependency resolver or the request lifetime scope, never from the container itself. (See inner exception for details.) ---> Autofac.Core.DependencyResolutionException: No scope with a tag matching 'AutofacWebRequest' is visible from the scope in which the instance was requested.



当我注册 MatchServices 类时 SingleInstance它正在工作,但 InstancePerRequest没有用。为什么?我什至没有在 MatchServices 中做任何 DI .

最佳答案

根据 Autofac documentation :

Use InstancePerLifetimeScope instead of InstancePerRequest. In previous ASP.NET integration you could register a dependency as InstancePerRequest which would ensure only one instance of the dependency would be created per HTTP request. This worked because Autofac was in charge of setting up the per-request lifetime scope. With the introduction of Microsoft.Extensions.DependencyInjection, the creation of per-request and other child lifetime scopes is now part of the conforming container provided by the framework, so all child lifetime scopes are treated equally - there’s no special “request level scope” anymore. Instead of registering your dependencies InstancePerRequest, use InstancePerLifetimeScope and you should get the same behavior. Note if you are creating your own lifetime scopes during web requests, you will get a new instance in these child scopes.



另外,您还有 another issue :

Note that Populate is basically a foreach to add things into Autofac that are in the collection. If you register things in Autofac BEFORE Populate then the stuff in the ServiceCollection can override those things; if you register AFTER Populate those registrations can override things in the ServiceCollection. Mix and match as needed.



换句话说,这些行的顺序也有误:
builder.Populate(services);
builder.RegisterType<MatchServices>().As<IMatchServices>().InstancePerLifetimeScope();

关于.NET Core 2.0 Autofac 注册类 InstancePerRequest 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48705473/

相关文章:

.net - 列出进程中的 AppDomain

c# - 管理开发团队之间的错误

.net - 有选择地从 LINQ 表达式树中的 where 子句中删除

sql-server - 无法从 Docker 容器连接到 SQL Server

angular - 如何将视频文件作为 Angular block 上传(版本 8)

java - 依赖注入(inject) Java 设计模式单例

.net - 通过 web.config 对 WCF 服务的 Unity 依赖注入(inject)

asp.net - 循环列表并调整它

asp.net-core - 是否可以部署未编译的 ASP.NET Razor Pages 网站?

grails - Grails 中的邮件插件