最近,我与一位同事讨论了Web应用程序中的存储库(在本例中是实体框架之上的层)是否应该实现为静态或非静态类。
在这个问题中,如果一个或另一个实现是更好的(OOP)设计我不感兴趣,因为这会使答案变得主观。
我感兴趣的是:当您将静态与非静态类进行比较时,实例化并处理在CLR中以不同方式处理的实体框架DbContext
吗?我对多线程问题和内存使用特别感兴趣,因为此代码在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...
};
}
}
}
非静态存储库
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...
};
}
}
}
答案 0 :(得分:3)
静态方法和实例方法的调用之间的唯一区别是静态方法使用少一个参数:传递给实例方法的this
引用。并且由于DbContext
在两种情况下都存储在局部变量中,因此当方法以任一方式终止时,可以自由地进行垃圾收集。没有区别。
使用静态存储库IMHO仍然没有任何借口。好的与更好的设计可能是主观的。好与坏的设计不是。 SoC和SRP也不是。