类设计问题(一次性和单一行为)

时间:2010-05-09 12:39:40

标签: c# wcf oop singleton dispose

Repository类具有单例行为,_db实现一次性模式。除了_db对象在第一次调用之后被释放,并且由于单例行为,任何其他_db调用都将崩溃。

 [ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
 public class Repository : IRepository
 {
    private readonly DataBase _db;

    public Repository(DataBase db)
    {
        _db = db;
    }

    public int GetCount()
    {
        using(_db)
        {
            return _db.Menus.Count();
        }
    }

    public Item GetItem(int id)
    {
        using(_db)
        {
            return _db.Menus.FirstOrDefault(x=>x.Id == id);
        }
    } 

  }

我的问题是,有没有办法设计这个类,以便在不删除单例行为的情况下正常工作? Repository课程将提供大量请求。

2 个答案:

答案 0 :(得分:2)

执行此操作时:

using(_db)

您要保证在您的对象上调用Dispose()。

我建议将其更改为使用带有_db的私有静态成员的静态类。

public static class Repository {
  private static DataBase _db; 

  // static constructor
  static Repository () {
    _db = new Database();
  }

  public static int GetCount() {
    return _db.Menus.Count();
  }
  public Item GetItem(int id) {
    return _db.Menus.FirstOrDefault(x=>x.Id == id);
  }
}

答案 1 :(得分:2)

当您向DataBase提供Repository实例时,这意味着创建和处置不在Repository类的范围内。因此,Repository不应该处置该实例。你应该删除using语句,你会没事的。写下Repository如下:

public class Repository : IRepository
{
    private readonly DataBase _db;

    public Repository(DataBase db)
    {
        _db = db;
    }

    public int GetCount()
    {
        return _db.Menus.Count();
    }

    public Item GetItem(int id)
    {
        return _db.Menus.FirstOrDefault(x=>x.Id == id);
    } 
}