C#,Android:删除Singleton

时间:2018-04-27 10:08:16

标签: c# android singleton

我正在开展一个有很多帐户管理的项目。不幸的是,设置所有这些的人正在度假,这里需要做些什么,但我似乎无法理解这里到底发生了什么(我对此有点新鲜......)

基本上,据我所知:当有人登录我们的应用程序时,会创建一个单独的帐户。这里有两个类重要:

namespace Accounts
{
    //Generische und Lazy Singleton-Abstraktion
    public abstract class AbstractAccount<T> where T : class
    {
        // Lazy Instanziierung
        private static readonly Lazy<T> _instance = new Lazy<T>(() => CreateSingletonInstance());

        public static T Instance
        {
            get
            {              
              //  throw new System.InvalidOperationException("out");
                return _instance.Value;
            }
        }

        private static T CreateSingletonInstance()
        {
            // Konstruktion des Singleton-Objekts
            return Activator.CreateInstance(typeof(T), true) as T;
        }
    }
}

    class Account : AbstractAccount<Account>
    {
        // öffentliche Felder und Methoden
        public string Username { get; set; }
        public string Password { get; set; }
        public string Email { get; set; }

        public string Description { get; set; }
        public List<string>Friendlist { get; set; }
        public Bitmap ProfilePicutre { get; set; }
        public int Experience { get; set; }
        public int gender { get; set; }
        public DateTime lastLogin { get; set; }
        public DateTime dateCreated { get; set; }
        public string Locality { get; set; }
        public string Country { get; set; }
        public string CountryCode { get; set; }
        public int level { get; set; }


        public void SetCurrentAccount(tblUsers user, DateTime lastLogin)
        {
            this.Username = user.getUsername();
            this.Email = user.getEmail();
            this.Password = user.getPassword();
            this.Description = user.getdescription();
            this.Experience = user.getexperience();
            this.gender = user.getgender();
            this.lastLogin = lastLogin;
            this.dateCreated = user.getDateCreated();
            this.level = CheckLevel(Experience);                     
        }
}

现在出现问题:当用户登录然后创建新帐户时,他或她仍然会设置他刚刚注销的用户的属性。

例如:如果他有1000 xp积分,那么退出并创建一个新帐户,该帐户不会从0点开始,而是在1000点开始。

我知道他从另一台电脑处理的时间非常多(甚至可能是不可能的)但我真的需要帮助:

    private void logoutClick(object sender, EventArgs e)
    {
        Context mContext = Android.App.Application.Context;
        AppPreferences ap = new AppPreferences(mContext);
        ap.deletePreferences();
        this.FinishAffinity();

        //Remove static variables. Just to be sure!
        SaveAccountInfo.bpLandScapePicFull = null;
        SaveAccountInfo.bpLandScapePicThumb = null;
        SaveAccountInfo.bpProfilePicFull = null;
        SaveAccountInfo.bpProfilePicThumb = null;

        StartActivity(typeof(Activity_AcctCreationLogin));
        Finish();
    }

如果用户现在要注销,则需要完全销毁单例,并在创建其他帐户时重新设置。我试过"Account.Instance.Dispose()" 但不幸的是,实例后没有“处理”这样的方法。

你们有没有机会帮助我一点点?真是太棒了!非常感谢! :)

3 个答案:

答案 0 :(得分:4)

您可以将实例的值设置为新值。

在您的Account类中创建一个在注销时执行此操作的方法。

 _instance = new Lazy<T>(() => CreateSingletonInstance());

答案 1 :(得分:1)

你应该使用这两种方法来使用Singleton模式:

public static T GetInstance
{
    get
    {   
       if (_instance == null)
         _instance = new Lazy<T>(() => CreateSingletonInstance());
       return _instance.Value;
    }
}
public static void ReleaseInstance   // called on logout
{
    _instance = null;
}

另外,正如DavidG指出的那样,你应该添加一个受保护的构造函数。

答案 2 :(得分:0)

您是否可以实现IDisposable接口,然后编写自己的dispose方法。然后,您可以使用此方法清除要清除的数据。希望这会有所帮助。