3

これは古くからの疲れた質問に違いないことはわかっていますが、信頼できる友人 (別名 Google) で何も見つけられないようです。

アプリケーションの起動時にユーザーにログインフォームを表示する.net 3.5 c# winformsアプリがあります。ログインに成功したら、DB に移動し、ユーザー固有のデータをいくつか取得して、それらをAppCurrentUser.csというクラスに (プロパティで) 保持します。これにより、アセンブリ内のすべてのクラスでアクセスできるようになります。目的これは、必要なたびに DB を呼び出す代わりに、1 回限りのデータ読み取りでいくつかのプロパティを埋めることができるということです。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; }
} 

ここで、専門家のアドバイスが必要なオプションがいくつかあります。

「愚かな」クラスなので、プロパティを非静的にし、クラスをインスタンス化してからプロパティを設定する必要があります...しかし、そのインスタンスには、それが作成されたクラス内からしかアクセスできませんよね?

論理的には、これらのプロパティは静的である必要があると思います。これは、アプリケーション全体でクラスを 1 回だけ使用し (新しいインスタンスを作成しないため)、アプリケーションを閉じるとプロパティ値が「リセット」されるためです。(そのインスタンスを作成すると、アプリケーションの終了時に破棄できます)

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

ありがとう!

4

4 に答える 4

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 プロパティにアクセスする場合も処理する必要があります。

于 2009-08-10T23:08:14.177 に答える
1

アーキテクチャのセットアップ方法によって異なります。すべてのビジネス ロジック コードを実際のフォーム内で実行している場合 (たとえば、UI に結合している場合)、フォームを作成するときにユーザー情報をパラメーターとして渡し、そのフォーム内からユーザー情報への参照を保持することをお勧めします。形。つまり、Singletonパターンを実装することになります。

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

于 2009-08-10T23:00:01.713 に答える
0

この種類の情報を格納する正しい場所は、IIdentity のカスタム実装です。ユーザーまたはそのアクセス権を識別するために必要な情報は、そのオブジェクトに格納できます。このオブジェクトは現在のスレッドに関連付けられ、必要なときにいつでも現在のスレッドからクエリを実行できます。

このプリンシパルは、Rocky Lhotka の CLSA ブック、または google winforms カスタム アイデンティティに示されています。

于 2009-08-10T23:08:22.787 に答える
0

これが正しい方法であるとは確信していませんが、次のようなことができます(とにかく求めているようです):

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

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

C#が間違っている場合に備えて...私はvb.net開発者です...

次に、Sessions.USernameなどを使用します

于 2009-08-10T23:10:00.943 に答える