【问题标题】:Is anything wrong with using static readonly references for a service class?对服务类使用静态只读引用有什么问题吗?
【发布时间】:2013-02-13 22:42:14
【问题描述】:

我继承了这段代码,原作者出于某种原因非常喜欢静态只读引用。

我在下面概述了一般模式,拥有这些静态只读引用有什么影响?

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);
   }
}

【问题讨论】:

    标签: c# asp.net oop soa


    【解决方案1】:

    static 表示只存在一个ISomethingFactory 实例,并且可以通过该类型访问该实例(DbAccess 的每个实例不是一个实例)。

    只读表示初始化后,该值不能被覆盖。

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 所以不会有任何锁定/序列化问题?
      • @user1361315:任何锁定问题都取决于您引用的对象以及您如何使用它。如果你想序列化属性,那么你会遇到问题,因为静态成员没有序列化,因为它们不是对象实例的一部分。
      猜你喜欢
      • 2015-04-03
      • 1970-01-01
      • 2015-04-05
      • 2011-01-29
      • 2012-11-18
      • 1970-01-01
      • 2016-08-31
      • 2023-03-06
      • 1970-01-01
      相关资源
      最近更新 更多