c# - 作为静态或非静态类的存储库?

标签 c# asp.net entity-framework repository clr

最近我与一位同事讨论了 Web 应用程序中的存储库(在本例中是 Entity Framework 之上的一层)应该作为静态类还是非静态类来实现。

在这个问题中,我对一个或另一个实现是否是更好的 (OOP) 设计不感兴趣,因为这会使答案变得主观。

我感兴趣的是:当您将静态类与非静态类进行比较时, Entity Framework DbContext 的实例化和处置是否以不同的方式在 CLR 中处理?我对多线程问题和内存使用特别感兴趣,因为这段代码在 MVC 网络应用程序中运行。

编辑: 澄清一下:我对存储库类的处置或垃圾收集不感兴趣,我只对本地 context 变量发生的事情感兴趣。当方法返回时,说它是垃圾收集(或至少标记为垃圾收集)是否正确?

静态存储库

public static class AccountRepository
{
    public static AccountModel GetAccountById(int accountId)
    {
        using (var context = new EntitiesContext())
        {
            var account = context.Accounts.FirstOrDefault(a => a.Id == accountId);
            if (account == null)
            {
                return null;
            }

            return new AccountModel
            {
                Id = account.Id,
                Username = account.Username,
                // etc...
            };
        }
    }
}

非静态存储库

public class AccountRepository
{
    public AccountModel GetAccountById(int accountId)
    {
        using (var context = new EntitiesContext())
        {
            var account = context.Accounts.FirstOrDefault(a => a.Id == accountId);
            if (account == null)
            {
                return null;
            }

            return new AccountModel
            {
                Id = account.Id,
                Username = account.Username,
                // etc...
            };
        }
    }
}

最佳答案

调用静态方法和调用实例方法的唯一区别是静态方法少用一个参数:传递给实例方法的this 引用。由于 DbContext 在这两种情况下都存储在局部变量中,因此当方法以任何一种方式终止时,它都可以自由地进行垃圾回收。那里没有区别。

恕我直言,这仍然不是使用静态存储库的借口。好与更好的设计可能是主观的。好与坏的设计不是。 SoC 和 SRP 也不是。

关于c# - 作为静态或非静态类的存储库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29794242/

相关文章:

c# - Web API 获取多部分/表单数据响应的最简单方法

c# - 在 ASP.NET 3.5 母版页中突出显示当前页面

c# - 如何确定将在矩形中绘制的文本的高度?

c# - 如何修复异常无法加载文件或程序集 'EntityFramework, Version=4.0.0.0[...]' 或其依赖项之一

c# - 方法 'System.Linq.Queryable.SelectMany System.Linq.IQueryable 的类型参数

c# - LINQ to Entities 无法识别 ElementAt 方法

c# - Excel、C#、VBA等中解析地址 "label"字段?

c# - 通过 http 请求调用 ASP.NET Web 服务方法

c# - 如何将变量连接到某些 <asp : . ./> 属性中?

asp.net - Asp.Net 中的正则表达式