繁体   English   中英

Autofac SingleInstance更新失败

[英]Autofac SingleInstance Update failed

我有以下课程可以保存和获取用户的数据。

 public class AuthenticationMethod : IAuthenticationMethod
{
    private readonly IUserService _userService;
    private readonly IFormCustomizationsService _formCustomizationsService;
    private readonly IGridCustomizationsService _gridCustomizationsService;

    public virtual User CurrentUser { get; set; }
    public virtual List<ViewFormCustomizations> CurrentFormCustomizations { get; set; }
    public virtual List<ViewGridCustomizations> CurrentGridCustomizations { get; set; }

    public AuthenticationMethod(IUserService userService, IFormCustomizationsService formCustomizationsService, IGridCustomizationsService gridCustomizationsService)
    {
        _userService = userService;
        _gridCustomizationsService = gridCustomizationsService;
        _formCustomizationsService = formCustomizationsService;
    }

    public bool LoginCurrentUser(string userName, string password)
    {
        CurrentUser = _userService.IsAuthenticated(userName, password);
        if (CurrentUser == null || !CurrentUser.IsActive)
        {
            CurrentUser = null;
            return false;
        }

        Initialize(CurrentUser);
        return true;
    }

    public void LogoutCurrentUser()
    {
        CurrentUser = null;
        CurrentFormCustomizations = null;
        CurrentGridCustomizations = null;
    }

    public virtual void Initialize(User user)
    {
        CurrentUser = user;

        InitialFormCustomizations();
        InitialGridCustomizations();
    }

    public virtual void InitialFormCustomizations()
    {
        CurrentFormCustomizations = _formCustomizationsService.GetByUserId(CurrentUser.ID).ToList();
    }

    public virtual void InitialFormCustomization( Guid formId)
    {
        RemoveFormCustomization(formId);

        var newformCustomization = _formCustomizationsService.GetUserFormCustomization(CurrentUser.ID, formId);
        CurrentFormCustomizations.Add(newformCustomization);
    }

    public virtual void RemoveFormCustomization(Guid formId)
    {
        CurrentFormCustomizations = CurrentFormCustomizations.Where(p => p.FormID != formId).ToList();
    }

    public virtual void InitialGridCustomizations()
    {
        CurrentGridCustomizations = _gridCustomizationsService.GetByUserId(CurrentUser.ID).ToList();
    }

    public virtual void InitialGridCustomization(Guid gridId)
    {
        RemoveGridCustomization(gridId);

        var newgridCustomization = _gridCustomizationsService.GetUserGridCustomization(CurrentUser.ID, gridId);
        CurrentGridCustomizations.Add(newgridCustomization);
    }

    public virtual void RemoveGridCustomization(Guid gridId)
    {
        CurrentGridCustomizations = CurrentGridCustomizations.Where(p => p.GridID != gridId).ToList();
    }

    public ViewFormCustomizations GetFormCustomizationsById(Guid formId)
    {
        return CurrentFormCustomizations.SingleOrDefault(q => q.FormID == formId);
    }

    public ViewGridCustomizations GetGridCustomizationsById(Guid gridId)
    {
        return CurrentGridCustomizations.SingleOrDefault(q => q.GridID == gridId);

    }
}

我使用autofac将此类注册为singleInstance:

builder.RegisterType(typeof (AuthenticationMethod)).As(typeof (IAuthenticationMethod)).SingleInstance();

但是当我的用户或用户的信息(formCustomization或GridCustomization)更改并且我想用新数据(例如函数InitialFormCustomization )重新加载AuthenticationMethod时,当我想将其他实例与Autofac Resolve ,旧数据将返回而不是新数据更新的数据...我该如何解决我的问题?


单个实例完全按照您指定的方式工作-它返回一个单例。 但是您的数据仅适用于当前用户。 如果所有用户共享该对象的同一实例,这将是一个问题。

一般而言,服务不应具有与之关联的任何状态。 状态是通常应通过应用程序服务方法传递的 运行时数据

但除此之外,除了将状态放入DI容器外,您还需要计划另一种存储状态的方法。 如果这是一个Web应用程序,则会话状态可能是一个选项,或者阅读关于使用会话状态作为某些可能(更好)替代方法的三思

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM