作为 MVC 3 和 EF 的新手,我试图了解为我的公司开发应用程序的最佳架构方法。该应用程序将是一个可能同时处理数百个用户的大型应用程序,因此我想确保我理解并遵循正确的程序。到目前为止,我已经确定简单的存储库模式(例如 Controller -> Repository -> EF)方法是最好且最容易实现的方法,但我不确定这是否绝对是最好的方法。该应用程序基本上将返回在 devexpress 网格中显示给用户的数据,他们可以修改这些数据/添加到它等等。
我发现了这篇文章,此时我感到很困惑,所以我想知道是否有任何理由尝试使用断开连接的 EF,以及为什么你甚至想要这样做:http://www.codeproject .com/Articles/81543/Finally-Entity-Framework-working-in-fully-disconne?msg=3717432#xx3717432xx
所以总结一下我的问题:
- 下面的代码可以接受吗?
- 它应该适用于大型 MVC 应用程序吗?
- 有没有更好的办法?
- 是否会从 EF 保持打开与 SQL 的不必要连接?(SQL Profiler 让它看起来像在 using 语句退出后保持打开一段时间)
- 断开连接的框架想法是更好的想法吗?您为什么还要这样做?我不相信我们需要跨层跟踪数据......
注意:存储库实现 IDisposable 并具有下面列出的 dispose 方法。它在存储库构造函数中创建实体上下文的新实例。
示例用法:
控制器(使用自定义成员资格提供程序登录):
if (MembershipService.ValidateUser(model.UserName, model.Password))
{
User newUser = new User();
using (AccountRepository repo = new AccountRepository())
{
newUser = repo.GetUser(model.UserName);
...
}
}
会员提供者验证用户:
public override bool ValidateUser(string username, string password)
{
using (AccountRepository repo = new AccountRepository())
{
try
{
if (string.IsNullOrEmpty(password.Trim()) || string.IsNullOrEmpty(username.Trim()))
return false;
string hash = FormsAuthentication.HashPasswordForStoringInConfigFile(password.Trim(), "md5");
bool exists = false;
exists = repo.UserExists(username, hash);
return exists;
}catch{
return false;
}
}
}
GetUser 和 UserExists 的帐户存储库方法:
获取用户:
public User GetUser(string userName)
{
try
{
return entities.Users.SingleOrDefault(user => user.UserName == userName);
}
catch (Exception Ex)
{
throw new Exception("An error occurred: " + Ex.Message);
}
}
用户存在:
public bool UserExists(string userName, string userPassword)
{
if (userName == "" || userPassword == "")
throw new ArgumentException(InvalidUsernamePassword);
try
{
bool exists = (entities.Users.SingleOrDefault(u => u.UserName == userName && u.Password == userPassword) != null);
return exists;
}
catch (Exception Ex)
{
throw new Exception("An error occurred: " + Ex.Message);
}
}
存储库片段(构造函数、Dispose 等):
public class AccountRepository : IDisposable
{
private DbContext entities;
public AccountRepository()
{
entities = new DbContext();
}
...
public void Dispose()
{
entities.Dispose();
}
}