TempDataDictionary
是您的
MessageManager
实现中的固有部分,因此,应直接在该类中实现它,而不是在容器中注册它。
例如:
public class MessageManager : IMessageManager
{
private TempDataDictionary _tempDataDictionary;
[...]
}
然而,我认为在控制器上下文之外使用TempDataDictionary
并不是一个好的实践方法,因此,你可以在每次添加或检索消息时将其传递:
void AddSuccess(IDictionary<string, object> tempData, string message);
你可以使用
PerThreadLifetimeManager
为每个请求创建一个
MessageManager
实例,然后就不需要使用
TempDataDictionary
了,你可以使用常规的列表或字典来实现这一点:
public class MessageManager : IMessageManager
{
private List<string> _successMessages = new List<string>();
private List<string> _errorMessages = new List<string>();
private List<string> _warningMessage = new List<string>();
private List<string> _infoMessage = new List<string>();
public void AddSuccess(string message)
{
_successMessages.Add(message);
}
public void AddError(string message)
{
_errorMessages.Add(message);
}
public void AddWarning(string message)
{
_warningMessages.Add(message);
}
public void AddInfo(string message)
{
_infoMessages.Add(message);
}
public List<string> SuccessMessages
{
get { return _successMessages; }
}
public List<string> ErrorMessages
{
get { return _errorMessages; }
}
public List<string> WarningMessages
{
get { return _warningMessages; }
}
public List<string> InfoMessages
{
get { return _infoMessages; }
}
}
然后,为每个线程注册它,以便在每个请求时清除所有内容:
Container.RegisterType.RegisterType<IMessageManager, MessageManager>
(new PerThreadLifetimeManager());
更好的做法?
如果您想确保列表在被读取之前保持不变,即使它是在另一个请求中发生的,或者如果您正在使用异步操作或ajax请求,您可以创建自己的LifetimeManager
实现,以会话为基础解析上述类的实例,例如:
public class SessionLifetimeManager : LifetimeManager
{
private string _key = Guid.NewGuid().ToString();
public override void RemoveValue(ILifetimeContainer container = null)
{
HttpContext.Current.Session.Remove(_key);
}
public override void SetValue(object newValue, ILifetimeContainer container = null)
{
HttpContext.Current.Session[_key] = newValue;
}
public override object GetValue(ILifetimeContainer container = null)
{
return HttpContext.Current.Session[_key];
}
protected override LifetimeManager OnCreateLifetimeManager()
{
return new PerSessionLifetimeManager();
}
}
然后将上述 PerThreadLifetimeManager
替换为 SessionLifetimeManager
,每次访问时只需清除列表即可,例如:
public List<string> InfoMessages
{
get
{
var tempInfoMessages = new List<string>(_infoMessages);
_infoMessages.Clear();
return tempInfoMessages;
}
}
参考资料:
SessionLifetimeManager 的实现代码来自于这里:https://gist.github.com/CrestApps/a246530e386b95d0a05d36bb13805259