1

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 を使用しています。

4

0 に答える 0