20

バックグラウンド

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

コントローラ

public class AccountController : Controller
{
    private readonly IAccountService _accountService; 

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

    ....
}

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

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

質問

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

4

2 に答える 2

45

現時点ではテストできないため、これは正しくないかもしれませんが、.NET 4 以降では次のようなことができると思います。

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

// ...

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

からコンテキストを直接取得するよりも、コントローラから実装にコンテキストを渡すほうが理にかなっている場合がありますIAccountServiceHttpContext.Current

于 2010-09-15T22:38:40.227 に答える
18

ただし、IAccountService の実装内で Url.GenerateUrl ヘルパー メソッドを使用したいと考えています。

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

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

これで、サービス クラス内で UrlHelper は必要なくなりました。MVC インフラストラクチャとやり取りする必要があるものはすべて、サービス クラスに配置しないでください。Request、Response、Session などに依存するべきではありません。これらのオブジェクトを処理し、それらをサービス クラスと結び付けるのはコントローラーの役割です。

于 2010-09-16T06:36:01.250 に答える