3

私はこのコードを継承しましたが、元の作成者は何らかの理由で静的な読み取り専用参照を非常に気に入っていました。

以下に一般的なパターンを概説しましたが、これらの静的な読み取り専用参照を持つことにはどのような影響がありますか?

public class DbAccess
{
    private static readonly ISomethingFactory = SomethingFactories.GetFactory("1");
    private static IThing1Dao Thing1Dao { get {return ISomethingFactory.Thing1Dao; }}
    private static IThing2Dao Thing2Dao { get {return ISomethingFactory.Thing2Dao; }}
}

public class SomethingFactories
{
   public static ISomethingFactory GetFactory(string key) 
   {
      switch(key)
      {
         case "...":
         return new SomeFactory();
      }
   }
}    

public class SomeFactory : ISomeFactory
{    
    public IThing1Dao Thing1Dao
    {
       get { return new Thing1Dao(); }
    }
}    

public class SomeService : ISomeService
{
    private static readonly IThing1Dao thing1Dao = DbAccess.Thing1Dao
    private static readonly IThing2Dao thing2Dao = DbAccess.Thing2Dao

    public Thing1Object1 GetObject1(int id)
    {
        return thing1Dao.GetObject1(id);    
    }

    public Thing1Object2 GetObject2(int id)
    {
        return thing1Dao.GetObject2(id);
    }
}

.aspx ページでの使用法は次のようになります。

public class MyBasePage : System.Web.UI.Page
{
    protected static readonly SomeService someService = new SomeService();     
}    

public class SomeAspxPage : MyBasePage
{
   void btnAddObject1(...)
   {
      Thing1Object1 obj1 = someService.GetObject(1);
   }
}
4

2 に答える 2

3

staticは、のインスタンスが1つだけISomethingFactory存在し、そのインスタンスにタイプを介してアクセスできることを意味します(のインスタンスごとに1つのインスタンスではありませんDbAccess)。

読み取り専用とは、初期化後、値を上書きできないことを意味します。

これは、起動時のデータ(app.configのデータなど)に基づいて初期化を実行するためのごく普通のパターンです。

于 2013-02-27T22:29:34.597 に答える
3

Web アプリケーションはマルチスレッドであるため、静的メンバーの用途は限られています。

オブジェクトへの静的参照がある場合、そのオブジェクトはスレッド セーフである必要があります。または、いつでも 1 つのスレッドだけがそのオブジェクトを使用できるように、オブジェクトの使用を同期する必要があります。

静的参照を読み取り専用にするということは、一度設定すると変更できないため、参照自体がスレッドセーフであることを意味しますが、参照しているオブジェクトが自動的にスレッドセーフになるわけではありません。

于 2013-02-27T22:32:16.230 に答える