桌面应用程序中静态类中的DataContext

时间:2012-07-05 06:30:23

标签: c# sql winforms linq linq-to-sql

我在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)
  3. 由于

2 个答案:

答案 0 :(得分:4)

  

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

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

  

有更好的方法来处理DBClassesDataContext,而不是每次在方法

中创建它

不 - 这是正确的做法。为什么你尝试以避免每次都创建它?

答案 1 :(得分:0)

尽管我可能因为不同意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();

    }
}

您将在此课程之外管理您的datacontext。

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

Repository pattern with Linq to SQL using IoC, Dependency Injection, Unit of Work