0

我在我的 winform 应用程序中使用 3 层架构,所以我有处理设备操作的静态类

 public static class Equipments 
{


    public static void AddEquipment(string name, decimal dimLength)
    {

            DBClassesDataContext db = new DBClassesDataContext();

            Equipment equipment = new Equipment();
            equipment.Name = name;
            equipment.DimLength = dimLength;

            db.Equipments.InsertOnSubmit(equipment);
            db.SubmitChanges();

    }



  public static void UpdateEquipment(int equipmentID, string name, decimal dimLength)
        {
                         DBClassesDataContext db = new DBClassesDataContext();

                Equipment oldEquipment;
                oldEquipment = db.Equipments.Where("EquipmentID = @0",equipmentID).SingleOrDefault();
                oldEquipment.Name = name;
                oldEquipment.DimLength = dimLength;

                db.SubmitChanges();}

所以我的问题是:

  1. 我需要在每个方法中创建 DBClassesDataContext 的实例吗?
    因为当我完成全局静态 DBClassesDataContext 时它不能正常工作。
  2. 有没有更好的方法来处理 DBClassesDataContext 而不是每次在方法内创建它(比如每次我从这个类运行一个方法时创建新的 DBClassesDataContext )

谢谢

4

2 回答 2

4

我需要在每个方法中创建 DBClassesDataContext 的实例吗?

你应该这样做,绝对 - 就像你通常应该在SqlConnection每次想要以非 LINQ 代码访问数据库时创建一个新的一样。一般来说,避免全局状态——这几乎总是一个坏主意。

有更好的方法来处理 DBClassesDataContext 而不是每次在方法内创建它

不——这正是正确的方法。为什么你会尽量避免每次都创建它?

于 2012-07-05T06:33:55.153 回答
1

尽管我可能会因为不同意 Jon Skeet 而被石头砸死,但我还是会发布这个。

您绝对不需要在每个方法中都创建实例,或者至少不需要这样。我喜欢遵循一个叫做 DRY 的原则——不要重复自己,一遍又一遍地重复同一行,这是可以避免的,显然违反了这个原则。

您在这里有多种选择:

1.) 将方法定义为实例方法,可能是这样的:

internal class MyDbActions
{
    private MyDbContext _myDbContext;
    private MyDbContext Db
    {
        get
        {
            if (_myDbContext == null) _myDbContext = new MyDbContext();
            return _myDbContext;
        }
    }

    internal void Add(SomeClass c)
    {
        Db.Table.AddObject(c);
        Db.SubmitChanges();
        Db.Dispose();
    }
}

或者类似的东西,你明白了。这可以修改为您需要的任何内容。

2.) use 可以为你的方法使用依赖注入,所以考虑这样的事情:

public static class Equipments 
{
    public static void AddEquipment(DBClassesDataContext db, string name, decimal dimLength)
    {
            Equipment equipment = new Equipment();
            equipment.Name = name;
            equipment.DimLength = dimLength;

            db.Equipments.InsertOnSubmit(equipment);
            db.SubmitChanges();

    }
}

您将在此类之外管理您的数据上下文。

3.) 您可以利用存储库模式、工作单元模式和 IoC。我不会在这里发布示例代码,因为它很长,但这里有一个链接可以给你一个想法:

使用 IoC、依赖注入、工作单元的 Linq to SQL 的存储库模式

于 2012-07-05T08:44:10.523 回答