gpt4 book ai didi

c# - LINQ-To-SQL 业务层对象 DataContext

转载 作者:行者123 更新时间:2023-11-30 21:22:47 24 4
gpt4 key购买 nike

最初,我将我的 DataContext 对象用作全局单例。在 ASP.Net 中使用它时,由于 ASP.Net 的多线程特性,我遇到了争用问题。

所以我搜索了一些更好的替代品,并找到了 Rick Strahl's post关于“每个对象”的场景。所以我的每个对象都会有一个类本地的 DataContext。

所以我已经弄清楚了其中的大部分内容,但是在尝试获取对象的实例时出现了我的问题。由于所有方法都是实例方法,因此我需要先获取该类的实例。然后我可以使用该实例调用实例方法来获取我想要的对象。

像这样的..

 Customer cust = new Customer();
cust = cust.GetCustomer(primaryKeyID); // gets data using LINQ-To-SQL

创建一个类的实例只是为了调用一个方法来返回我想要的实际实例对我来说似乎是多余的。这是这样做的正确方法吗?我认为还有一种不同的方法仍然遵循 Rick 在他的博客文章中使用的方法。

示例类代码:

 public partial class Customer
{
MyDataContext db = new MyDataContext(Settings.MyConnectionString);

public Customer GetCustomer(Int64 custID)
{
return db.Customers.SingleOrDefault(c => c.ID == custID);
}

public Customer AddCustomer(Customer c)
{
db.Customers.InsertOnSubmit(c);
db.SubmitChanges();
}
}

最佳答案

仅解决有关冗余的问题,而不评论我尚未审查的整个 context-per-object 哲学或 Rick 的代码,

你可以去掉这两行

var customer = new Customer().GetCustomer(primaryKeyId);

或者,创建一个充当静态网关的工厂:

public static class CustomerFactory
{
public static Customer BuildCustomerWithId(_<int/short/long>_ primaryKeyId)
{
var customer = new Customer();
return customer.GetCustomer(primaryKeyId);
}
}

这不仅会清理您的对象创建(现在您只需调用 var customer = CustomerFactory.BuildCustomerWithId(1);),而且现在您可以修改 BuildCustomerWithId() 方法,如有必要,无需更改使用类。例如,您可能稍后决定不喜欢在业务对象中实例化 DataContext,然后将其全部重构。您可以改为在工厂中实例化 DataContext,而不必更改任何调用 BuildCustomerWithId() 的代码。静态网关使单元测试更具挑战性,但仍然比直接实例化 Customer 对象容易得多。

我意识到这并不能解决首先实例化然后调用 getter 方法的问题,但坦率地说,从性能的角度来看,我不认为这是一个问题——仅在语法/可读性方面。

关于c# - LINQ-To-SQL 业务层对象 DataContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2127299/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com