亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我該如何正確地將`TempDataDictionary`注入我的班級?

我該如何正確地將`TempDataDictionary`注入我的班級?

C#
海綿寶寶撒 2021-05-14 17:12:55
我有一個使用c#和ASP.NET MVC 5編寫的應用程序。我還使用Unity.Mvc進行依賴項注入。與許多其他類一起,該類MessageManager在IoC容器中注冊。但是,MessageManager該類依賴于的實例TempDataDictionary來執行其工作。此類用于為視圖寫入臨時數據。為了解析的實例,MessageManager我還需要注冊的實例TempDataDictionary。我將需要能夠TempDataDictionary從MessageManager類中添加值,然后需要從視圖訪問臨時數據。因此,我需要能夠訪問TempDataDictionary視圖中的相同實例,以便可以將消息寫給用戶。另外,如果控制器將用戶重定向到其他地方,我也不想丟失消息,但我仍然希望能夠在下一個視圖中顯示該消息。我嘗試了以下方法來注冊TempDataDictionary和MessageManager:Container.RegisterType<TempDataDictionary>(new PerThreadLifetimeManager())         .RegisterType<IMessageManager, MessageManager>();然后,在我看來,我有以下解決方案來解決 IMessageManagervar manager = DependencyResolver.Current.GetService<IMessageManager>();但是,該消息由于某種原因而丟失。也就是說,當我解析時manager,TempDataDictionary不包含MessageManager從控制器添加的任何消息。如何正確注冊的實例,TempDataDictionary以便數據一直保留到被查看?更新 這是我的IMessageManager界面public interface IMessageManager{    void AddSuccess(string message, int? dismissAfter = null);    void AddError(string message, int? dismissAfter = null);    void AddInfo(string message, int? dismissAfter = null);    void AddWarning(string message, int? dismissAfter = null);    Dictionary<string, IEnumerable<FlashMessage>> GetAlerts();}
查看完整描述

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; 

    }

}


查看完整回答
反對 回復 2021-05-21
?
幕布斯6054654

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

}

然后,您可以在請求中保留該消息,管理何時將該消息標記為已看到,甚至讓用戶看到他的舊消息(如果您愿意的話)


查看完整回答
反對 回復 2021-05-21
  • 2 回答
  • 0 關注
  • 176 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號