グローバルオブジェクトの作成?

私は次のことを達成しようとしています:

ユーザーが正常に認証されたら、別のフォーム(またはクラス)からアクセスできるグローバルユーザーオブジェクトを作成する必要があります。

私はVSで利用可能なデータソースを調べていましたが、達成しようとしているものに適した「オブジェクト」オプションがあります。問題は、どのように動作するのかわかりません。

誰かが私を正しい方向に向けることができますか?

ありがとう。

3
これらのさまざまな「フォームまたはクラス」は、この「ユーザーオブジェクト」からどのような情報を必要としますか?
追加された 著者 Adam Ralph,
その属性を読み取る(場合によっては変更する)ことができます。プロパティを介して。
追加された 著者 Nick,

3 答え

これがWindowsフォームアプリケーションであると仮定すると、静的なApplicationStateクラスに格納されているUserクラスを作成できます。

ステップ:

1)ユーザーに関する情報を保持するユーザークラスを作成します。

public class User
{
    public string Login { get; set; }
    //.. other properties
}

2)ApplicationStateクラスを作成します。

public static class ApplicationState
{
    public static User CurrentUser { get; set; }
}

3)ログインプロセスで、新しいバージョンのユーザークラスを作成し、それをApplicationState.CurrentUserプロパティに割り当てます。

    public void CompleteLogin(string sLogin)
    {
        User user = new User();

        user.Login = sLogin;

        ApplicationState.CurrentUser = user;
    }

4)プロジェクト内のどこでも ApplicationState.CurrentUser を使用できるようになりました。

4
追加された

これはシングルトンと呼ばれ、それは悪いことです(特に状態が変わる可能性がある場合)。代わりに、依存性注入(DI)を調べてください。そこには .NET固有の書籍もあります。

リクエストごとに、ここではDIを手動で行う単純な(おそらく単純化された)例があります。 DIコンテナライブラリ(Inversion of ControlまたはIoC Containerライブラリとも呼ばれます)を使用すると、コンポジションルートで「すべてを配線する」プロセスであり、通常はライフタイム管理などの機能も提供します。

// Composition root of your application
void Main()
{
   //Only instance of user we will ever create
    var user = new User();

    var instance = new MyClass(user);
}

public interface IUser
{
    string Name { get; set; }
}

public class User: IUser
{
    public string Name { get; set; }
}

public class MyClass
{
    public MyClass(IUser user)
    {
        if (user == null)
        {
            throw new ArgumentNullException("user");
        }

        _user = user;
    }

    private readonly IUser _user;
}
2
追加された
依存性注入の場合+1。高度な代替手段としてIoCコンテナを介して自動DIを参照することで、これを手動で基本的な手順として行う方法の簡単な例を追加する価値があります。
追加された 著者 Adam Ralph,

認証されたユーザーがリストに追加されたことを確認した後、フィールドアクセスをカプセル化したり、リストまたは文字列[]プロパティを作成したりして、これを行うこともできます。クラスレベルのプロパティを作成したい

0
追加された