关于密封性能的问题

本文关键字:性能 问题 密封 于密封 | 更新日期: 2023-09-27 17:50:11

嗨,我对下面的代码有两个问题。你能帮我解释一下吗?

1)为什么我们需要这个数据访问类的密封?
2)为什么我们需要这个连接字符串的单例?

新方法

namespace DataAccess
{   
  //Singleton implementation to return the same BooksRepository   
  public sealed class Repository
  {
    static BooksRepository _bookRepository = null;
    static string connectionString;
    private Repository() { }
    public static void ConnectionString(string cs) { connectionString = cs; }
    public static BooksRepository BookRepository(Boolean create)
    {
      if (connectionString == null) 
        throw new ApplicationException("Need to set connection string for Repository");
      if (!create && _bookRepository != null) return _bookRepository;
      else
      {
        _bookRepository = new BooksRepository(connectionString);
        return _bookRepository;
      }
    }
  }
}

应用于UI
Books = Repository.BookRepository(false).GetAllBooks();

------------------- 更新 ------------------------------------------------
**旧方法

这是我在我的大多数项目中实践的。它不是比像上面那样声明单例概念更容易和简单吗?

public partial class ZebraDataContext
{
    public ZebraDataContext()
        : base(ConfigurationManager.ConnectionStrings["ZebraConnString"].ToString())
    {
    }
}

In my Class

  public void Add()
    {
        using (TransactionScope ts = new TransactionScope())
        {
            using (ZebraDataContext db = new ZebraDataContext())
            {
                try
                {
                    db.Stocks.InsertOnSubmit(this);
                    db.SubmitChanges();
                }
                catch (Exception ex)
                {
                    System.Diagnostics.Debug.WriteLine(ex);
                    Logger.Error(typeof(Stock), ex.ToString());
                    throw;
                }
            }
            ts.Complete();
        }
    }

关于密封性能的问题

  1. 密封类是为了确保没有人继承这个类。由于JITer优化,这也使类性能更高。

  2. 您不需要为Repository对象的每个实例提供ConnectionString实例,因此它已被设置为静态

1)使用密封关键字使类不能被扩展。编写这个类的人认为他们需要防止人们扩展和修改行为。没有更大的背景,就不可能比这更详细地回答这个问题。

2) ConnectionString不是单例,它是静态的。由BookRepository()方法返回的BooksRepository是一个单例(或试图是真的)。同样,如果没有更大的上下文,就不可能说它是否需要是单例的。在这种情况下使用单例的原因是,如果您想确保应用程序中的任何地方都使用相同的BooksRepository对象。我假设作者试图确保在整个应用程序中使用相同的连接字符串连接到BooksRepository

然而,看看它是如何写的,它并没有真正遵守单例模式。似乎可以通过在BookRepository()方法中为create指定true来创建多个BooksRepository。对先前对象的任何现有引用仍然存在,不会改变。如果在调用BookRepository()之间改变了连接字符串,那么应用程序中就会有不同的连接字符串。

我想说,你看到的代码是创建静态类的pre . net 2.0方式,类不能被实例化或继承。

在您的情况下(从。net 2.0开始),它实际上相当于(注意静态类和删除私有构造函数)

  public static class Repository
  {
    static BooksRepository _bookRepository = null;
    static string connectionString;
    public static void ConnectionString(string cs) { connectionString = cs; }
    public static BooksRepository BookRepository(Boolean create)
    {
      if (connectionString == null) 
        throw new ApplicationException("Need to set connection string for Repository");
      if (!create && _bookRepository != null) return _bookRepository;
      else
      {
        _bookRepository = new BooksRepository(connectionString);
        return _bookRepository;
      }
    }
  }

是否应该使用静态连接是另一回事。我想说,在你的连接上至少使用[ThreadStatic],这样它就可以支持并发(多线程访问自己的连接)。

  [ThreadStatic] static BooksRepository _bookRepository = null;
  [ThreadStatic] static string connectionString;