[英]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.