【问题标题】:Autofac - injected instance doesn't work as singletonAutofac - 注入的实例不能作为单例工作
【发布时间】:2014-08-18 09:48:27
【问题描述】:

我用 Autofac 注册必要的类型为 InstancePerLifetimeScope

builder.RegisterType<WebSecurityContext>()
                .AsSelf()
                .InstancePerLifetimeScope();

并通过接口解决:

builder.Register<IApplicationContext>(context =>
            {
                return context.Resolve<WebSecurityContext>();
            })
            .As<IApplicationContext>();

我在我的 WebAPI 控制器中注入 ApplicationContext:

public class MedicalCenterController : BaseApiController
{
    private readonly IApplicationContext applicationContext;

    public MedicalCenterController(IApplicationContext applicationContext)
    {
        this.applicationContext = applicationContext;
    }

ApplicationContext 具有 MedicalCenterId 值。在 UI 上选择新的医疗中心后,此值应更改。

MedicalCenterId 的更改发生在还包含必要上下文的操作过滤器中。

public class MedicalCenterAttribute : ActionFilterAttribute
{
    public IApplicationContext ApplicationContext
    {
        get;
        set;
    }

    public override void OnActionExecuting(HttpActionContext filterContext)
    {
        .....
        ApplicationContext.SetMedicalCenterId(medicalCenterId);
    }
}

但在此之后,ApplicationContext 继续在 MedicalCenterController 和另一个控制器中保留以前的 MedicalCenterId 值。

虽然我使用 InstancePerLifetimeScope 对象,为什么 autofac 在不同的类中使用不同的实例?

谢谢。

【问题讨论】:

  • 听起来您打算让MedicalCenterId 成为每个用户/会话关联的值。实际上并没有与此概念相关联的生命周期范围。如果是我,我会实现我的 WebSecurityContext 从当前的 HttpSession 中提取这个值。

标签: c# .net asp.net-mvc dependency-injection autofac


【解决方案1】:

不要将生命周期范围与单例混淆。具有生命周期范围的实例的行为类似于单例,但仅在每个生命周期范围内。因此,从生命周期范围内解析的依赖服务将获得相同的实例,但在另一个生命周期范围内解析的服务将获得不同的实例。

因此,使用 ASP.NET 中的 Autofac,除了整个应用程序共享的全局/根生命周期范围外,每个请求都会获得一个新的生命周期范围。由于您的案例中的应用程序上下文是在生命周期范围内注册的,因此在每个请求上都会创建一个新的应用程序上下文。对一个实例所做的更改只有在同一生命周期范围内的服务才能看到,并且一旦请求完成就会丢失。

因此,不要将生命周期范围与单例混淆。单例必须注册到 SingleInstance,而不是 InstancePerLifetimeScope。

更新:因为您正在寻找一种方法来为每个用户设置“医疗中心 ID”,所以您不应该在 Autofac 中处理这些事情。我的建议是让ApplicationContext 在某些特定于用户的商店中加载/存储该值。这样,每当您查询 MedicalCenterId 时,它将按用户提供服务,而与您在容器中注册 ApplicationContext 的方式无关。

【讨论】:

  • 哦。谢谢!但是我不能使用单例,因为系统有很多用户,每个用户应该使用不同的ApplicationContext。您能就这个问题提供任何建议或解决方案吗?
  • @ArtyomPranovich - 我明白了。您的问题并不清楚,这表明您希望它是单身人士。我已经更新了我的答案......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-21
  • 2016-09-07
  • 1970-01-01
  • 2022-07-19
  • 1970-01-01
  • 2018-02-11
  • 1970-01-01
相关资源
最近更新 更多