静态方法是不是适用于 Linq To SQL DAL?
Posted
技术标签:
【中文标题】静态方法是不是适用于 Linq To SQL DAL?【英文标题】:Are static methods appropriate for a Linq To SQL DAL?静态方法是否适用于 Linq To SQL DAL? 【发布时间】:2011-01-15 09:06:50 【问题描述】:我正在为我的 DAL 使用 Linq to SQL,并且听说过有关在 Web 应用程序中使用静态方法的各种信息(关于线程/并发问题)。目前,我创建了一个测试 DAL,它似乎运行良好。但是,我创建它的方式有什么问题吗,因为它是静态的?
public static class TestDAL
public static bool GetUserAddress(string username)
testDBDataContext dbContext = new testDBDataContext();
//Linq code goes here
public static void InsertUserNumber(int userID)
testDBDataContext dbContext = new testDBDataContext();
//...
dbContext.UserDetails.InsertOnSubmit(nUser);
dbContext.SubmitChanges();
//etc... All the methods are created in the same way
这种方法适用于 Web 应用程序,还是在生产环境中会出现问题?
谢谢。
【问题讨论】:
你听说过关于线程/并发的哪些事情? @ScottE:我从未听说过任何详细信息(部分原因是我决定在这里问),但我记得看到一篇帖子声称可能存在与用户数据混合的问题其他人,因为他们同时访问了 DAL 方法。 【参考方案1】:从您提供的 sn-p 来看,各种方法的作用不是很清楚。在我看来,只要你使用局部变量,它是安全的。
【讨论】:
@Darin:感谢您的回复。其他方法非常通用,但它们都不共享任何全局变量。【参考方案2】:只要您的静态方法不使用任何共享状态(类级状态或其他全局状态),它们本身就不会导致在多线程环境中运行时出现任何问题。每个静态方法调用都会创建自己的局部变量的副本。
【讨论】:
@Jeff:感谢您的回复。不,这些方法在这方面几乎是独立的。我只记得看过一些 L2S 文章,它们似乎有一个只有一个 DataContext 实例的非静态类(由其他方法使用)。我只是想确保我拥有的方法(每个方法都创建了新的 DataContexts)不会有问题。 抱歉,忘记问了。如果一种方法调用另一种方法,这是否算作共享变量(其中任何一种方法也可以单独调用)?还是每个方法仍然会创建自己的局部变量? 静态方法可以相互调用而不会导致线程问题,只要这两种方法都只使用局部变量(和方法参数)。要了解在多线程环境(如 Web 应用程序)中运行时的风险以及可能出现的问题,我建议阅读 Joseph Albahari 经常推荐的“C# 中的线程”(albahari.com/threading)和 Jon Skeet 的“Multi- .NET 中的线程" (yoda.arachsys.com/csharp/threads)。 谢谢杰夫,这些链接很棒【参考方案3】:我个人会避免使用静态方法,因为它会使这段代码更难测试。在测试使用 DAL 的代码时,您将无法轻松地模拟 DAL。请注意,这不是 LINQ 或数据访问层所独有的,它只是代码作为类方法而不是实例方法的函数。
【讨论】:
@tvanfosson:感谢您的建议。这个当前的项目很小,所以测试不是决定因素。但是,在处理更大的项目时,我肯定会牢记实例方法。以上是关于静态方法是不是适用于 Linq To SQL DAL?的主要内容,如果未能解决你的问题,请参考以下文章
LINQ to Dataset 是 LINQ to EF 的子集还是这两者是独立的?
LINQ to Dataset 是 LINQ to EF 的子集还是这两者是独立的?