我在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();}
所以我的问题是:
由于
答案 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