MVC アプリケーションをできるだけ効率的にしようとしています。Entity Framework または MVC で解決できるかどうかわからない次の問題に遭遇しました。
私は次のルートを持っています:
routes.MapRoute(
"UserNameRoute",
"{UserName}/{Action}",
new { controller = "UserName", action = "Index" },
new
{
UserName = new UserConstraint(DependencyResolver.Current.GetService<IUserRepository>())
});
次に、次のルート制約:
private readonly IUserRepository repository;
public UserConstraint(IUserRepository repository)
{
if (repository == null)
{
throw new ArgumentNullException("repository");
}
this.repository = repository;
}
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
if (!values.ContainsKey(parameterName))
{
return false;
}
var siteRoot = (string)values[parameterName];
var user = this.repository.Users.FirstOrDefault(u => u.UserName == userName && !u.Archived);
if (user!= null)
{
values[parameterName] = user;
return true;
}
return false;
}
}
次に、各アクションに必要なコントローラーは次のとおりです。
public ActionResult ExampleAction(User userName)
{
return this.View(userName);
}
これはうまく機能し、ユーザーをアクションにまったく問題なく受け入れることができます。次のようにビューにアクションリンクを配置すると、問題が発生します。
@Html.ActionLink("View some action or other", "someaction", new { UserName = Model.UserName }, new { @class = "myclass" })
上記のこのアクション リンクは、必要に応じて IRouteConstraint を介してルーティングし、DB で別のデータベースを選択して、以前と同じユーザーを取得します。これは、ページ上の各アクション リンクに対して行われます。データベースの選択が一度だけ実行されるように、これを行うより効率的な方法はありますか?
私はおそらく、最初に EF でコードを使用していることを指摘する必要があります。私は汎用リポジトリや独自の作業単位を使用していません。MVC のバージョン 4 と Entity Framework の v4.3 を使用しています。