2013-04-16 2 views
0

Я расширяю свое приложение с помощью AccountManager (как я его называю). Приложение имеет регистрационную форму (это другая форма, чем основная форма) и информация, введенная здесь будет set к AccountManager классу:Как получить доступ к переменной по всему миру?

AccountManager AM = new AccountManager(); 
AM.username = "Username"; 
AM.password = "myPassword"; 

Но, теперь (вероятно, очевидно) вопрос, я могу» т захватить эту информацию на главной форме (так я называю new AccountManager(); так будет начать новый экземпляр AccountManager.

Как я могу использовать класс (AccountManager) во всем мире? Или я просто сделать их общие переменные с static атрибут?

+0

Это не имеет никакого отношения к его вопрос ... – Max

+2

Прежде всего вам нужно узнать о разделении бизнес-логики и пользовательского интерфейса. нет абсолютно никаких оснований для того, чтобы это было в любой форме, только (возможно), возвращенной из «формы входа». ничто из этого не должно быть глобальным. Более того, эта концепция была реализована не менее 20000000000 раз в мире .Net. –

+0

Это приложение Windows или веб-приложение (ASP.NET)? Имейте в виду, что в ASP.NET статические классы разделяются между ВСЕМИ сеансами пользователя. –

ответ

-1

Вы можете отправить переменные в constructor из AccountManager, как следующее:

На Main:

AccountManager AM = new AccountManager(Username, Password); 

На AccountManager:

public AccountManager(string username, string password) 
{ 

} 

Или вы могли бы сделать AccountManager статический class:

Static Class MSDN

+0

Downvoter, помогите объяснить? – Max

2

Вы можете передать свой AccountManager AM в качестве параметра в свою форму входа, например.

loginForm.Show(AM); 

и LoginForm там должно быть что-то вроде:

AccountManager accountManager = null; 
public DialogResult ShowDialog(AccountManager am) 
{ 
accountManager = am; 
return this.ShowDialog();  
} 
+0

Спасибо, не подумали об этом. Однако я бы пошел один синглтон, так что у меня всегда есть один и тот же экземпляр, поэтому мне не нужно сначала создавать его в определенном месте, а затем продолжать передавать его. – Devator

+0

Уверен, что одноэлементный способ лучше, если вам нужен экземпляр accountmanager в нескольких разных местах вашего проекта. Mix Nathan - мое решение, если вы хотите иметь дополнительную сборку с многократно используемыми элементами GUI. – wonko79

3

Создайте внутренний статический одноэлементный экземпляр вашего счета менеджера:

public class AccountManager 
{ 
    private static Lazy<AccountManager> _am = new Lazy<AccountManager>(); 
    internal static AccountManager Current { get { return _am.Value; } } 
} 

Таким образом, вы можете получить доступ (гарантировано) singleton экземпляра AccountManager в текущем домене приложения из любой точки одной и той же сборки: AccountManager.Current

Посмотрите методы конструктора для Lazy - вы можете предоставить фабричный метод, если хотите (тем самым позволяя сохранить пароль правильно инкапсулированным), а также вы можете гарантировать безопасность потока по методу фабрики.

Кроме того, Lazy означает, что любые дорогостоящие операции, связанные с созданием объекта AccountManager, будут отложены до тех пор, пока это не будет абсолютно необходимо, что означает, что ваше приложение не будет использовать ресурсы до тех пор, пока это не станет абсолютно необходимым.

+0

Спасибо, я, вероятно, пойду по синглтонному пути. Однако тип 'Lazy ' недоступен для моей .Net-версии ('3.5'). – Devator

+0

Нет проблем :) Я рекомендую обновить вашу версию .NET, если это вообще возможно. – Nathan

+0

Не могли бы вы взглянуть на мой пример? Знания .Net очень ограничены, поэтому любая помощь будет оценена. У меня есть действительно минимальный проект, который можно скачать как ZIP [здесь] (https://dl.dropboxusercontent.com/u/6166898/SingletonExample.zip) – Devator

0

Проверьте ниже. Класс учетной записи содержит имя пользователя и пароль. Используйте AccountManager для инициализации объекта Account один раз. Используйте метод AccountManager.GetAccountInfo() для получения учетной записи глобально.

class Account 
{ 
    public string username { get; set; } 
    public string password { get; set; } 

    public Account(string username, string password) 
    { 
     this.username = username; 
     this.password = password; 
    } 
} 

class AccountManager 
{ 
    Account acc = null; 

    public AccountManager(string username, string password) 
    { 
     if(acc == null) 
     { 
      acc = new Account(username, password); 
     } 
    } 

    public Account GetAccountInfo() 
    { 
     return acc; 
    } 
} 
0

Я решил его, используя следующий метод:

На моем mainForm я инициировать AccountManager:

public static AccountManager AM = new AccountManager(); 

Затем на каждой форме мне нужно получить доступ к моему AccountManager, я используйте следующий фрагмент кода:

AccountManager AM = mainForm.AM; 
MessageBox.Show(AM.username);