2 回答

TA貢獻1829條經驗 獲得超7個贊
該TempDataDictionary是你的內在組成部分MessageManager執行情況,因此,你應該實現它是類里面,而不是直接在容器中對其進行注冊的。
就像是:
public class MessageManager : IMessageManager
{
private TempDataDictionary _tempDataDictionary;
[...]
}
但是,恕我直言,我認為TempDataDictionary在控制器上下文之外使用不是一個好習慣,因此,您可以在每次添加或檢索消息時通過它,而不是在您的類中實現它:
void AddSuccess(IDictionary<string, object> tempData, string message);
您還可以MessageManager使用來為每個請求創建一個實例PerThreadLifetimeManager,然后根本不需要使用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
{
// Some view has accessed the data, clear the list before returning
var tempInfoMessages = new List<string>(_infoMessages);
_infoMessages.Clear();
return tempInfoMessages;
}
}

TA貢獻1876條經驗 獲得超7個贊
嚴格來說,這不是答案,而是另一種建議:
另外,如果控制器將用戶重定向到其他地方,我也不想丟失消息,但我仍然希望能夠在下一個視圖中顯示該消息。
僅僅看一下上面的內容,對我來說,將您的消息存儲在數據庫中可能是一個更好的選擇。這樣,您甚至可以返回過去并根據需要查看舊消息。
// persist in EF db context
class Message {
DateTime CreatedUtc { get; set; }
DateTime SeenUtc { get; set; }
string Text { get; set; }
AspNetUser User { get; set; }
// etc
}
然后,您可以在請求中保留該消息,管理何時將該消息標記為已看到,甚至讓用戶看到他的舊消息(如果您愿意的話)
- 2 回答
- 0 關注
- 176 瀏覽
添加回答
舉報