[英]What are the pros/cons of choosing between static and instance data access classes in a web app?
我已经阅读了关于这个主题的其他几个问题( 这里 , 这里 , 这里 ),但还没有看到一个很好的答案。 我之前已经开发了我公平的数据访问层,并且个人更喜欢使用实例类而不是静态类。 但是,它更多的是个人偏好(我喜欢测试我的业务对象,这种方法可以更容易地模拟DAL)。 我之前使用静态类来访问数据库,但我总是觉得这种设计的适当性有点不安全(特别是在ASP.NET环境中)。
任何人都可以在这两种方法中使用ADO.NET提供程序(无ORM)开发数据访问类,特别是在ASP.NET应用程序中,可以提供一些好的优点/缺点。 如果您有更一般的静态与实例类技巧,请随意加入。
特别是,我担心的问题是:
谢谢!
基于静态的方法通常只有一个,而且只有一个主要优点:它们易于实现。
基于实例的方法赢得了:
静态方法可以赢得:
总的来说,我觉得基于实例的方法更优越。 如果您要扩展到单个服务器之外,这一点变得更加重要,因为一旦您开始在多台计算机上实例化,静态方法就会“中断”...
我多年来一直在使用静态DAL,我同意你的担忧。 线程和并发是最具挑战性的,在我的情况下,我将不同的连接对象存储在线程静态结构中。 它已被证明是非常可扩展的并且表现良好,现在我将PropertyInfo转换为PropertyDescriptor,这给了我更好的性能反射的相同好处。 在我的DAL中,我只需写:
List<Entity> tableRows = SQL.Read(new SearchCriteria(), new Table());
所有东西都会产生SQL静态类,这使我的代码变得更加简单。
对我来说,主要原因是我不需要保持该DAL对象的状态。 它使用的对象的状态不会跨越它们嵌入的方法的范围。 这样,为什么你会保留一个对象的多个实例,如果它们都是相同的?
使用最新版本的ADO.NET,似乎是在调用范围内创建和销毁数据库连接的最佳实践,并且让ConnectionPool无论如何都要处理整个连接的可重用性问题。
再次使用最新版本的.NET Framework,TransactionScope(这将是您自己管理连接的一个原因)向上移动到业务级别,这允许您在同一范围内连接多个DAL调用。
因此,我无法看到创建和销毁(或缓存)DAL实例的强制案例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.