首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Autofac将WebAPI UrlHelper注入服务

使用Autofac将WebAPI UrlHelper注入服务
EN

Stack Overflow用户
提问于 2013-06-25 17:57:24
回答 3查看 3.5K关注 0票数 9

在我的WebAPI项目中,我有一个服务被几个控制器使用。该服务需要生成UrlHelper,因此理想情况下,它将通过构造函数参数获取URL。

代码语言:javascript
复制
public class MyService
{
    public MyService(UrlHelper urlHelper) { ... }
}

我使用Autofac作为我的IoC容器。如何在容器中注册UrlHelper?它需要一个HttpRequestMessage,而我不知道如何获取“当前”消息。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-01-04 16:44:55

使用RegisterHttpRequestMessage方法注册当前请求,然后也可以注册URL helper,如下所示:

代码语言:javascript
复制
public static IContainer SetupContainer(HttpConfiguration config)
{
    var containerBuilder = new ContainerBuilder();

    // Register your Web API.
    containerBuilder.RegisterApiControllers(Assembly.GetExecutingAssembly());
    containerBuilder.RegisterHttpRequestMessage(config);
    containerBuilder.Register(x => new UrlHelper(x.Resolve<HttpRequestMessage>()));  
    containerBuilder.RegisterWebApiFilterProvider(config);
    containerBuilder.RegisterWebApiModelBinderProvider();

    // Register your other types...

    var container = containerBuilder.Build();

    // Set the dependency resolver to be Autofac.
    config.DependencyResolver = new AutofacWebApiDependencyResolver(container);

    return container;
}
票数 9
EN

Stack Overflow用户

发布于 2013-06-25 22:49:52

基于Darrel Miller的评论,我创建了以下内容:

一个简单的容器类,用来保存对“当前”HttpRequestMessage的引用

代码语言:javascript
复制
public class CurrentRequest
{
    public HttpRequestMessage Value { get; set; }
}

将存储当前请求的消息处理程序

代码语言:javascript
复制
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时,添加消息处理程序。

代码语言:javascript
复制
GlobalConfiguration.Configuration.MessageHandlers.Insert(0, new CurrentRequestHandler());

然后,配置Autofac容器,让它构造UrlHelper,从CurrentRequest对象获取当前请求。

代码语言:javascript
复制
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();

然后,可以像其他依赖项一样将UrlHelper注入到MyService中。

感谢Darrel为我指明了正确的方向。

票数 5
EN

Stack Overflow用户

发布于 2013-06-25 18:56:11

我能想到的最好的办法就是让你的服务像这样实现IAutofacActionFilter

代码语言:javascript
复制
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配置

代码语言:javascript
复制
builder.RegisterType<MyService>()
                 .AsWebApiActionFilterFor<SomeController>()
                 .AsSelf()
                 .InstancePerApiRequest();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17294257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档