关于密封性能的问题

时间:2011-04-15 01:56:45

标签: c# winforms

您好我对以下代码有2个问题。你能帮我解释一下吗?

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())
    {
    }
}

在我的班级

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

3 个答案:

答案 0 :(得分:1)

1)使用sealed关键字使其无法扩展。编写课程的人决定他们需要阻止人们扩展和修改行为。如果没有更大的背景,就不可能更详细地回答这个问题。

2)ConnectionString不是单身人士,而是静态的。 BooksRepository方法返回的BookRepository()是单例(或尝试真实)。再一次没有更大的背景,就不可能说它是否需要单身。在这种情况下使用单例的原因是,如果要确保应用程序中的任何位置都使用相同的BooksRepository对象。我假设作者试图确保在整个应用程序中使用相同的连接字符串连接到BooksRepository

但是,看看这是怎么写的,它并没有真正服从单身模式。您可以通过在BooksRepository方法中为create指定true来创建多个BookRepository()。对先前对象的任何现有引用仍将存在且不会更改。如果在调用BookRepository()之间更改了连接字符串,则应用程序中将存在不同的连接字符串。

答案 1 :(得分:1)

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

  2. 对于Repository对象的每个实例,您不需要ConnectionString的实例,因此它已经变为静态。

答案 2 :(得分:0)

我想说你看到的代码是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;