9

WebAPI プロジェクトのいくつかのコントローラーで使用されるサービスがあります。サービスは URL を生成する必要があるため、理想的にはUrlHelperコンストラクタ パラメータを介して取得します。

public class MyService
{
    public MyService(UrlHelper urlHelper) { ... }
}

IoC コンテナーとして Autofac を使用しています。UrlHelperコンテナーに登録するにはどうすればよいですか? が必要でHttpRequestMessage、「現在の」メッセージを取得する方法がわかりません。

4

3 に答える 3

5

Darrel Miller のコメントに基づいて、以下を作成しました。

「現在の」HttpRequestMessage への参照を保持する単純なコンテナ クラス

public class CurrentRequest
{
    public HttpRequestMessage Value { get; set; }
}

現在のリクエストを格納するメッセージ ハンドラ

public class CurrentRequestHandler : DelegatingHandler
{
    protected async override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
    {
        var scope = request.GetDependencyScope();
        var currentRequest = (CurrentRequest)scope.GetService(typeof(CurrentRequest));
        currentRequest.Value = request;
        return await base.SendAsync(request, cancellationToken);
    }
}

Global.asax で、WebAPI を構成するときに、メッセージ ハンドラーを追加します。

GlobalConfiguration.Configuration.MessageHandlers.Insert(0, new CurrentRequestHandler());

UrlHelper次に、オブジェクトから現在のリクエストを取得して、 を構築できるように Autofac コンテナーを構成しCurrentRequestます。

var builder = new ContainerBuilder();
builder.RegisterType<CurrentRequest>().InstancePerApiRequest();
builder.Register(c => new UrlHelper(c.Resolve<CurrentRequest>().Value));
builder.RegisterType<MyService>();
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
...
container = builder.Build();

UrlHelperMyServiceその後、他の依存関係と同じように に注入できます。

私を正しい方向に向けてくれたダレルに感謝します。

于 2013-06-25T14:49:52.213 に答える
0

私が考えることができる最善の方法は、サービスIAutofacActionFilterをそのように実装することです

public class MyService : IAutofacActionFilter
    {
        private UrlHelper _urlHelper;

        public void DoSomething()
        {
            var link = Url.Link("SomeRoute", new {});
        }

        private UrlHelper Url
        {
            get
            {
                if(_urlHelper == null)
                    throw new InvalidOperationException();

                return _urlHelper;
            }
        }

        public void OnActionExecuted(System.Web.Http.Filters.HttpActionExecutedContext actionExecutedContext)
        {            
        }

        public void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
        {
            this._urlHelper = actionContext.Request.GetUrlHelper();
        }
    }

次に、次の Autofac 構成のようなものを使用します

builder.RegisterType<MyService>()
                 .AsWebApiActionFilterFor<SomeController>()
                 .AsSelf()
                 .InstancePerApiRequest();
于 2013-06-25T10:56:10.983 に答える