MVC 3 と EF にはかなり慣れていないので、会社のアプリケーションを開発するための最適なアーキテクチャ アプローチを理解しようとしています。申請は、同時に数百人のユーザーを処理する可能性がある大規模な申請になるため、適切な手順を理解し、従うことを確認したいと思います。これまでのところ、単純なリポジトリ パターン (コントローラー -> リポジトリ -> EF など) のアプローチが最適で最も簡単に実装できると判断しましたが、それが最善の方法であるかどうかはわかりません。アプリケーションは基本的に、devexpress グリッドでユーザーに表示されるデータを返し、ユーザーはこのデータを変更したり、追加したりできます。
私はこの記事を見つけましたが、現時点ではかなり混乱しているので、切断された EF を使用しようとする理由があるかどうか、また、なぜそうしたいのか疑問に思っています: http://www.codeproject .com/Articles/81543/Finally-Entity-Framework-working-in-fully-disconne?msg=3717432#xx3717432xx
私の質問を要約すると:
- 以下のコードは受け入れられますか?
- 大規模な MVC アプリケーションで問題なく動作するはずですか?
- より良い方法はありますか?
- SQL への不要な接続は EF から開いたままになりますか? (SQL プロファイラーは、using ステートメントが終了した後も、しばらく開いたままのように見せます)
- 切断されたフレームワークのアイデアはより良いものですか?なぜそれをしたいのですか? 層を超えてデータを追跡する必要があるとは思いません...
注:リポジトリは IDisposable を実装し、以下に示す dispose メソッドを備えています。リポジトリ コンストラクターでエンティティ コンテキストの新しいインスタンスを作成します。
使用例:
コントローラー(カスタム メンバーシップ プロバイダーを使用してログオン):
if (MembershipService.ValidateUser(model.UserName, model.Password))
{
User newUser = new User();
using (AccountRepository repo = new AccountRepository())
{
newUser = repo.GetUser(model.UserName);
...
}
}
メンバーシップ プロバイダー ValidateUser:
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);
}
}
リポジトリ スニペット (コンストラクター、破棄など):
public class AccountRepository : IDisposable
{
private DbContext entities;
public AccountRepository()
{
entities = new DbContext();
}
...
public void Dispose()
{
entities.Dispose();
}
}