1

多くのユーザーコントロールを使用するWinFormsプロジェクトがあります。これらのユーザーコントロールの一部は、ビジネスロジック層のクラスを使用します。これらのクラスは、主にデータベースへのCRUD操作(データアクセス層を介して)に加えて、いくつかの追加の検証とレポートを実行しています。

プロジェクトは、いくつかの一般的なオブジェクト(ログに記録されたユーザー、いくつかのコントローラー、およびバリデーター)を使用します。これらのオブジェクトは、メインフォームでインスタンス化され、初期化メソッドまたはパブリックプロパティを介して子ユーザーコントロールに挿入されます。これは、これらの共通オブジェクトを親コントロールから子コントロールに渡すだけのコードがたくさんあることを意味します。

これを回避するために、静的クラス(たとえば、ApplicationContext)を作成し、それにすべての一般的なコントロールを保存することができます。これはメインフォームで発生し、プロジェクト内の他のすべてのユーザーコントロールまたはフォームで使用できます。

このパターンは一般的に推奨されていないことがわかります(静的クラスにグローバルデータを格納する)。しかし、このデータが不変である場合はどうなるでしょうか。このアプローチはこれまでに良いアイデアですか?

または、すべての初期化コードを取り除くのに役立つ他のアプローチを知っていますか?

4

4 に答える 4

2

UnityAutofacなどの制御の反転コンテナを使用して、オブジェクトグラフを自動的に接続することができます。

共通オブジェクトのいずれかを必要とする各オブジェクトに、コンストラクター引数を介して、またはパブリックプロパティとして、インターフェイスへの依存関係を定義させることができます。IoCコンテナーは、適切なオブジェクトを相互に接続します。

Unityを使用したプロパティインジェクションの例:

public class MyUserControl : UserControl 
{
    [Dependency]
    public LoggedUserService UserService { get; set; }

    public void Method()
    {
        // the IoC container will ensure that the UserService
        // property has been set to an object
    }
}

メインフォームで行うのは、IoCコンテナに認識させたい共通オブジェクトを登録してから、ルートオブジェクトを要求することだけです。オブジェクトグラフは魔法のように組み立てられ、すべてのワイヤーコードを作成したり、それがどのように行われるかを気にする必要はありません。

于 2011-09-22T07:45:17.487 に答える
1

グローバルオブジェクトを維持するために依存性注入/iocコンテナを使用できます。私はautofacライブラリで良い経験をしましたが、他にもたくさんあります。セッターインジェクションを使用する場合、すべてのコントロールは自動的に設定された依存オブジェクトを取得します。

于 2011-09-22T07:46:00.320 に答える
1

この状況では、シングルトンを使用することをお勧めします。シングルトンを使用すると、オブジェクトの同じインスタンスを使用でき、静的よりも安全で柔軟性があります。

public sealed class Singleton
{
    public object Property1 {get;set;}
    public void Method1 (){}

    static Singleton instance = null;
    static readonly object padlock = new object();

    Singleton()
    {
    }

    public static Singleton Instance
    {
        get
        {
            lock (padlock)
            {
                if (instance==null)
                {
                    instance = new Singleton();
                }
                return instance;
            }
        }
    }        
}

そうすれば、静的なように使用できますが、少し異なります...

public class Main
{
     public Main()
     {
         Singleton.Instance.Property1 = "somevalue";
         Singleton.Instance.Method1();
     }

}
于 2011-09-22T07:56:33.960 に答える
0

静的クラスを使用して、不変のデータを格納できます。これで問題はありません。ただし、コントロールをそこに保存したい場合は、期待どおりに機能しない可能性があります。たとえば、OnDataBindingやRenderのようなメソッド。

于 2011-09-22T07:45:50.507 に答える