使用Autofac将WebAPI UrlHelper注入服务

And*_*vey 9 c# autofac asp.net-web-api

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

public class MyService
{
    public MyService(UrlHelper urlHelper) { ... }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用Autofac作为我的IoC容器.我怎样才能UrlHelper在容器中注册?它需要一个HttpRequestMessage,我无法弄清楚如何获得"当前"消息.

Muh*_*eed 9

使用该RegisterHttpRequestMessage方法注册当前请求,然后您也可以注册URL帮助程序,如下所示:

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;
}
Run Code Online (Sandbox Code Playgroud)


And*_*vey 5

根据 Darrel Miller 的评论,我创建了以下内容:

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

public class CurrentRequest
{
    public HttpRequestMessage Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

在 Global.asax 中,配置 WebAPI 时,添加消息处理程序。

GlobalConfiguration.Configuration.MessageHandlers.Insert(0, new CurrentRequestHandler());
Run Code Online (Sandbox Code Playgroud)

然后,配置 Autofac 容器让它构造UrlHelper,从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();
Run Code Online (Sandbox Code Playgroud)

UrlHelper然后可以MyService像任何其他依赖项一样注入到。

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

  • 我刚刚为 Autofac.WebApi 添加了对 HttpRequestMessage 依赖注入的支持,它将包含在下一个版本中。https://code.google.com/p/autofac/source/detail?r=60d369499963b89224c1f682cfbf8592eae95342 (8认同)