Autofac SingleInstance更新失败

时间:2016-06-05 13:49:05

标签: c# dependency-injection singleton autofac

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

 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的表单,旧数据返回而不是新更新的数据... 我怎样才能解决我的问题?

1 个答案:

答案 0 :(得分:1)

Single instance正是按照你指定的方式工作 - 它返回一个单例。但您的数据仅适用于当前用户。如果所有用户共享同一个对象实例,则会出现此问题。

一般来说,服务不应该有任何与之相关的状态。状态是运行时数据,通常应该是pass through the methods of application services

但除此之外,您需要计划另一种存储状态的方法,而不是将其放入DI容器中。如果这是一个Web应用程序,则会话状态可能是一个选项,或者对于某些可能(更好)的替代方案,请阅读Think twice about using session state