web-dev-qa-db-ja.com

コントローラの外部でRequestContextにアクセスするにはどうすればよいですか?

バックグラウンド

私はビジネスロジックをコントローラーから独自のサービスに移そうとしています。

コントローラ

_public class AccountController : Controller
{
    private readonly IAccountService _accountService; 

    public AccountController(IAccountService accountService)
    {
        _accountService = accountService;
    }

    ....
}
_

Unityを使用して依存性を注入しています。 IAccountServiceの実装内でUrl.GenerateUrl()ヘルパーメソッドを使用したいのですが、Urlはコントローラーに対するプロパティです。

これがどのように行われるかを確認するためにMVCソースを調べましたが、コントローラーの外部からRequestContextにアクセスする必要があり、その方法がわかりません。

質問

コントローラの外部からRequestContextにアクセスするにはどうすればよいですか?それでも問題が解決しない場合は、セットアップで問題を解決するにはどうすればよいですか?

19
nfplee

ただし、IAccountServiceの実装内でUrl.GenerateUrlヘルパーメソッドを使用したい

この情報をパラメータとして渡すだけです。例:

public ActionResult Index()
{
    var someUrl = Url.Action("about");
    _accountService.Foo(someUrl);
}

これで、サービスクラス内にUrlHelperは必要なくなりました。 MVCインフラストラクチャとの対話が必要なものはすべて、サービスクラスに配置しないでください。それらは、要求、応答、セッションなどに依存するべきではありません...これらのオブジェクトを操作し、サービスクラスと一緒に接着するのはコントローラーの責任です。

15
Darin Dimitrov

現時点ではテストできないため、これは正しくない可能性がありますが、.NET4以降では次のようなことができると思います。

using System.Web;
using System.Web.Mvc;

// ...

var helper = new UrlHelper(HttpContext.Current.Request.RequestContext);
string url = helper.GenerateUrl(/* ... */);

mightは、コンテキストを HttpContext.Currentから直接取得するよりも、コントローラーからIAccountService実装に渡す方が理にかなっています。

44
LukeH