2009-08-10 10 views
3

これは古くて疲れた質問でなければなりませんが、信頼できる友人(Googleとも呼ばれます)を通して何かを見つけることはできません。Winforms:アプリケーション全体のアクセスクラスプロパティ

私は、アプリケーション起動時にユーザーにログインフォームを提示する.net 3.5 c#winformsアプリケーションを持っています。ログインに成功した後、私はDBに逃げ出し、ユーザー固有のデータをいくつか取り出して、プロパティ内のAppCurrentUser.csというクラスに保持して、アセンブリ内のすべてのクラスにアクセスできるようにしたい - 私が必要とするたびにDBを呼び出すのではなく、一度だけ読み込んだデータでいくつかのプロパティを満たすことができます。 Webアプリケーションでは、通常セッション変数を使用しますが、その概念はWinFormsには存在しません。

クラス構造は、次のようになります。今

public class AppCurrentUser { 

    public AppCurrentUser() { } 

    public Guid UserName { get; set; } 
    public List<string> Roles { get; set; } 
    public string Firstname { get; set; } 
    public string Lastname { get; set; } 
} 

、私は上のいくつかの専門家のアドバイス必要があるいくつかのオプションがあります。「ダム」クラスなので

を、私はプロパティをしなければならない非静的、クラスをインスタンス化し、プロパティを設定します...しかし、私はそれが作成されたクラス内からそのインスタンスにアクセスすることができますか?

論理的に、私は私だけ(それの新しいインスタンスを作成し、ない)アプリケーション全体で一度クラスを使用するように、これらのプロパティは静的であることを信じて、それがプロパティの値は上の「リセット」されますアプリケーションを閉じる。

クラスをどのように構造化すればよいですか?また、アセンブリ内のすべてのクラスでそのプロパティにアクセスするにはどうすればよいですか?私は本当にこれについてあなたの正直で大切なアドバイスを感謝します!

ありがとうございます!

答えて

5

がここにシングルトンパターンを使用します今

public class AppUser 
{ 
    private static _current = null; 
    public static AppUser Current 
    { 
     get { return = _current; } 
    } 

    public static void Init() 
    { 
     if (_current == null) 
     { 
      _current = new AppUser(); 
      // Load everything from the DB. 
      // Name = Dd.GetName(); 
     } 
    } 

    public string Name { get; private set; } 
} 

// App startup. 
AppUser.Init(); 

// Now any form/class/whatever can simply do: 
var name = AppUser.Current.Name; 

を「静的」なものはスレッド安全ではありません。 lock()構文を適切に使用してスレッドセーフにする方法を理解するために、読者の練習として残しておきます。 Initへの呼び出しの前にCurrentプロパティにアクセスする場合も、このケースを処理する必要があります。

1

どのようにアーキテクチャを設定するかによって異なります。実際のフォーム内ですべてのビジネスロジックコードを実行している場合(UIに結合するなど)、フォームを作成するときにパラメータとしてユーザー情報を渡し、その中から参照情報を保持したいと思うかもしれません形。つまり、Singletonパターンを実装しています。

また、ユーザーオブジェクトを要求するたびに、依存性注入フレームワーク(StructureMapなど)が正しいオブジェクトを提供するように、依存性注入を使用することもできます。 - ステートフルな環境で作業するので、セッション変数のように使用することができます。

+0

こんにちは!返信いただきありがとうございます!いいえ、私のBLは別のクラスにあり、UIから呼び出されます。また、静的対非静的引数で有効ですか? – Shalan

+0

StructureMapを今読んで – Shalan

+0

私はDIがここで過度だと言うでしょう。 Shalanはおそらく初心者であり、依存関係の注入は避けるべきです。シングルトンパターンのようなより基本的な概念が、あなたが示唆しているように、よりよく理解されるまで回避されるべきです。 – xanadont

0

このタイプの情報を保存する正しい場所は、IIdentityのカスタム実装です。ユーザーまたはそのアクセス権を識別するために必要な情報は、そのオブジェクトに格納され、現在のスレッドに関連付けられ、必要に応じて現在のスレッドから照会できます。

このプリンシパルは、Rocky Lhotka's CLSA booksまたはgoogle winformsカスタムIDで示されています。

0

私はこれが正しい方法である確信していないが、あなたは、この(あなたがとにかくを求めているもののようです)のような何かを行うことができます。C#が間違っている場合には

public class Sessions 
{ 
    // Variables 
    private static string _Username; 

    // properties 
    public static string Username 
    { 
     get 
     { 
      return _Username; 
     } 
     set 
     { 
      _Username = value; 
     } 
    } 
} 

を...私はvb.netの開発者です...

あなたはSessions.USernameなどを使用しています。

+0

静的プロパティはスレッドの問題を導入し、対処する必要があります。 – xanadont

関連する問題