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



最近我和一位同事讨论了web应用程序中的存储库(在本例中是实体框架之上的一层)应该实现为静态类还是非静态类。

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

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

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

静态存储库

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在这两种情况下都存储在本地变量中,因此当方法以任何一种方式终止时,都可以自由地进行垃圾收集。没有区别。

这仍然不是使用静态存储库IMHO的借口。好的设计和更好的设计可能是主观的。好与坏的设计不是。SoC和SRP都不是。

最新更新