C #, Android: Удалить синглтон - PullRequest
0 голосов
/ 27 апреля 2018

Я работаю над проектом, в котором ведется большая работа по управлению аккаунтом. К сожалению, парень, который все это устроил, находится в отпуске, и что-то здесь нужно сделать, но я не могу понять, что именно здесь происходит (я новичок в этом ...)

Итак, насколько я понимаю: когда кто-то входит в наше приложение, создается одноуровневая учетная запись. Здесь важны два класса:

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 голосов
/ 27 апреля 2018

Можно ли реализовать интерфейс IDisposable, а затем написать собственный метод dispose. Затем вы можете использовать этот метод для очистки данных, которые вы хотите очистить. Надеюсь, это поможет.

0 голосов
/ 27 апреля 2018

Вы должны использовать шаблон Singleton с помощью этих 2 методов:

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, вы должны добавить защищенный конструктор.

0 голосов
/ 27 апреля 2018

Вы можете установить значение вашего экземпляра на новое.

Создайте метод в своем классе Account, который делает это при выходе из системы.

 _instance = new Lazy<T>(() => CreateSingletonInstance());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...