【问题标题】:DataContext in static class in desktop application桌面应用程序中静态类中的 DataContext
【发布时间】:2012-07-05 06:30:23
【问题描述】:

我在我的 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)

谢谢

【问题讨论】:

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


    【解决方案1】:

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

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

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

    不,这正是正确的方法。为什么你会尝试避免每次都创建它?

    【讨论】:

    • 懒得在每个方法里写了 :-) 谢谢
    • 嗨,乔恩。用using 代替DataContext 好不好?
    【解决方案2】:

    尽管我可能会因为不同意 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。我不会在这里发布示例代码,因为它很长,但这里有一个链接可以给你一个想法:

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

    【讨论】:

      猜你喜欢
      • 2010-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-24
      • 2019-11-07
      • 1970-01-01
      相关资源
      最近更新 更多