コントローラーの外側のRequestContextにアクセスするにはどうすればよいですか?
-
03-10-2019 - |
質問
バックグラウンド
私は、ビジネスロジックをコントローラーから独自のサービスに移行しようとしています。
コントローラ
public class AccountController : Controller
{
private readonly IAccountService _accountService;
public AccountController(IAccountService accountService)
{
_accountService = accountService;
}
....
}
依存関係を注入するためにUnityを使用しています。使いたいです Url.GenerateUrl()
の実装内のヘルパーメソッド IAccountService
しかし Url
コントローラーに対するプロパティです。
MVCソースを見て、これがどのように行われるかを確認しましたが、アクセスする必要があります RequestContext
コントローラーの外から、それを行う方法がわかりません。
質問
コントローラーの外部からRequestContextにアクセスするにはどうすればよいですか?それが私の問題を解決しない場合、セットアップを考慮して問題を解決するにはどうすればよいですか?
解決
ただし、iaccountServiceの実装内でurl.genereTurlヘルパーメソッドを使用したい
この情報をパラメーターとして渡すだけです。例:
public ActionResult Index()
{
var someUrl = Url.Action("about");
_accountService.Foo(someUrl);
}
これで、サービスクラス内でurlhelperを必要としなくなりました。 MVCインフラストラクチャと対話する必要があるものはすべて、サービスクラスに配置されるべきではありません。リクエスト、応答、セッションなどに依存すべきではありません...これらのオブジェクトと連携して、サービスクラスと一緒に接着するのはコントローラーの責任です。
他のヒント
現時点ではテストできないため、これはまったく正しくないかもしれませんが、.NET 4+でこのようなことができると思います。
using System.Web;
using System.Web.Mvc;
// ...
var helper = new UrlHelper(HttpContext.Current.Request.RequestContext);
string url = helper.GenerateUrl(/* ... */);
それ そうかもしれない コントローラーからあなたにコンテキストを渡すためにもっと理にかなっています IAccountService
それを直接つかむのではなく、実装 HttpContext.Current
.