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表示只ISomethingFactory存在一个实例,并且可以通过类型访问该实例(不是每个实例一个实例DbAccess)。

readonly意味着,在初始化之后,该值不能被覆盖。

这是基于启动时数据(例如来自 app.config 的数据)执行初始化的相当正常的模式。

于 2013-02-27T22:29:34.597 回答
3

Web 应用程序是多线程的,因此静态成员的用途有限。

如果你有一个对象的静态引用,那么这个对象必须是线程安全的,或者你必须同步使用它,以便在任何时候只有一个线程可以使用它。

将静态引用设为只读意味着引用本身是线程安全的,因为一旦设置它就无法更改,但这不会自动使其引用线程安全的对象。

于 2013-02-27T22:32:16.230 回答