存储库是静态还是非静态类?

7 c# asp.net clr entity-framework repository

最近,我与一位同事讨论了Web应用程序中的存储库(在这种情况下是实体框架之上的层)是否应该实现为静态或非静态类.

在这个问题中,我不感兴趣,如果一个或另一个实现是一个更好的(OOP)设计,因为这将使答案主观.

我感兴趣的是:DbContext当你将静态类与非静态类进行比较时,实例化和处理在CLR中以不同方式处理的实体框架?我对多线程问题和内存使用特别感兴趣,因为此代码在MVC Web应用程序中运行.

编辑:只是为了澄清:我对存储库类的处理或垃圾收集不感兴趣,只是局部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...
            };
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

非静态存储库

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...
            };
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

bst*_*zel 4

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

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