静态或非静态存储库 class?
Repository as static or non-static class?
最近我与一位同事讨论了 Web 应用程序中的存储库(在本例中是 Entity Framework 之上的一层)应该实现为静态还是非静态 class es.
在这个问题中,如果一个或另一个实现是更好的 (OOP) 设计,我不感兴趣,因为这会使答案变得主观。
我感兴趣的是:当您比较静态与非静态 class 时,在 CLR 中以不同的方式处理实例化和处置 Entity Framework DbContext
吗?我对多线程问题和内存使用特别感兴趣,因为这段代码在 MVC web 应用程序中运行。
编辑: 澄清一下:我对存储库的处置或垃圾收集不感兴趣 class,只是本地 [=14] 发生了什么=] 变量。当方法 returns?
时,说它是垃圾收集(或至少标记为垃圾收集)是否正确
静态存储库
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 也不是。
最近我与一位同事讨论了 Web 应用程序中的存储库(在本例中是 Entity Framework 之上的一层)应该实现为静态还是非静态 class es.
在这个问题中,如果一个或另一个实现是更好的 (OOP) 设计,我不感兴趣,因为这会使答案变得主观。
我感兴趣的是:当您比较静态与非静态 class 时,在 CLR 中以不同的方式处理实例化和处置 Entity Framework DbContext
吗?我对多线程问题和内存使用特别感兴趣,因为这段代码在 MVC web 应用程序中运行。
编辑: 澄清一下:我对存储库的处置或垃圾收集不感兴趣 class,只是本地 [=14] 发生了什么=] 变量。当方法 returns?
时,说它是垃圾收集(或至少标记为垃圾收集)是否正确静态存储库
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 也不是。