2012-02-08 4 views
5

私はWP7の汎用ストレージを隔離ストレージに保存するための少し静的なオブジェクトを構築しました。これは古いプロジェクトではうまくいくが、いくつかの新しいプロジェクトではDIを使用して設定を管理している。私はDIのファンです。つまり、1つの場所で構成を変更し、すべての依存関係にフィルタを適用できるということです。DIの目的のための静的クラスの周りのインスタンスラッパーはアンチパターンですか?

私の考えは、Injectionと呼ばれる名前空間を作成し、このオブジェクトをインタフェースを持つインスタンスにラップして注入できるようにすることでした。また、より具体的な実装が必要なストレージハンドラをスワップアウトすることもできます。

これは一般的なプラクティスですか、これは反パターンですか?

メモ:私は静的オプションを誰も必要としないようにしたい、またはDIを使用することができます。私は単に最小限の量の複製で両方を有効にしようとしています。

+1

私は 'File'や他の静的なクラス/メソッドへの呼び出しをカプセル化するために同じアプローチを使用します。 So:いいえ、私はこれを反パターンとは見なしません。 –

答えて

8

これは常に表示されます。ほとんどの場合、すでに静的であるか封印されているか、あるいはインタフェースを実装していないレガシーコードを回避することです。インターフェイスの代わりに基本クラス、HttpContextBaseが私が考えることができる最も顕著な例です。

静的なオプションを保持したいので、それは基本的には現在の状況ですから、やり直してください。私はInjection名前空間を作成しませんでしたが、その名前はオブジェクトが果たす役割よりも力学について詳しく述べています。

あなたは正確にはと書かれていません。のクラスは静的ですが、私は静的メソッドを使って静的クラスについて話していると仮定しています。

もう少し洗練された解決策(クラスを少し変更できる場合)は、静的クラスをシングルトンに変更することです。そして、それは静的であると同時に、インタフェースを実装できます。

public class Foo : IFoo 
{ 
    private readonly static Foo instance = new Foo(); 

    private Foo() { } 

    public static Foo Instance 
    { 
     get { return Foo.instance; } 
    } 

    // IFoo member: 
    public void InterfaceFoo() 
    { 
     Foo.LegacyFoo(); 
    } 

    public static void LegacyFoo() 
    { 
     // Implementation goes here... 
    } 
} 

私は、このような解に到達するために必要な唯一のリファクタリングは、クラス自体が、具体的な作りと、それはシングルトンとしてインターフェイスを実装作ることだと思います。

古いクライアントはまだ私の意見ではFoo.LegacyFoo();

+1

おそらく、_Current_という静的プロパティがメソッドよりも優れています。 –

+0

おかげさまで、図書館は新しいものに過ぎず、そのような前提条件はありません。オブジェクトを静的にする理由は、依存性注入が気に入らない/望む人に使いやすいためです。シングルトンは、インターフェイスを使用できない静的クラスに関する別の問題を解決するため、より魅力的な提案です。 – deanvmc

+1

@MatíasFidemraizer:構造的には同じ、 'Instance'という静的なプロパティがあります。私はシングルトンが時間の経過と共に変わるかもしれないことを意味するので、「Current」という単語はここでは良いとは思わない。 –

1

を呼び出すことにより、そのメソッドにアクセスすることができ、私はそれが一時的またはシングルトンだ場合は依存性注入コンテナを決めさせたい - 私はあなたがすでに使用しているものの枠組みを知りません、それらのほとんどは依存関係のライフサイクルを制御する必要があります - 。

事前依存注入アプリケーションは、アプリケーション全体の状態管理の一部としてこのオブジェクトの静的インスタンスを維持することがあります。

関連する問題