我有以下课程用于保存并获取用户的数据。
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
的表单,旧数据返回而不是新更新的数据...
我怎样才能解决我的问题?
答案 0 :(得分:1)
Single instance正是按照你指定的方式工作 - 它返回一个单例。但您的数据仅适用于当前用户。如果所有用户共享同一个对象实例,则会出现此问题。
一般来说,服务不应该有任何与之相关的状态。状态是运行时数据,通常应该是pass through the methods of application services。
但除此之外,您需要计划另一种存储状态的方法,而不是将其放入DI容器中。如果这是一个Web应用程序,则会话状态可能是一个选项,或者对于某些可能(更好)的替代方案,请阅读Think twice about using session state。