对服务类使用静态只读引用有什么问题吗?

本文关键字:什么 问题 引用 只读 服务 静态 | 更新日期: 2023-09-27 18:01:23

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

我已经在下面概述了一般模式,拥有这些静态只读引用会有什么后果?

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

对服务类使用静态只读引用有什么问题吗?

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

readonly表示初始化后不能覆盖该值。

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

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

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

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