使用来自请求的信息的AddTransient服务

时间:2016-03-23 19:06:35

标签: dependency-injection asp.net-core

我使用内置的DI框架在asp.net核心中获得了一个应用程序。我想向提供商添加每请求(即瞬态)服务,但我希望在构建时实际使用该请求。

services.AddTransient<IMyService>(provider => { ... });

这是我能找到的最近的重载,但provider对象没有关于当前请求的任何内容。有没有办法实现我尝试做的事情,而无需升级到更强大的DI框架?

1 个答案:

答案 0 :(得分:1)

如评论中所述,如果IHttpContextAccessor是您唯一需要的,则可以将HttpContext注入您的服务并访问它。

public class MyService : IMyService
{
    private readonly HttpContext context;

    public MyService(IHttpContextAccessor httpContextAccessor) 
    {
        if(IHttpContextAccessor==null) 
            throw new ArgumentNullException(nameof(httpContextAccessor));

        context = httpContextAccessor.HttpContext;
    }
}

但是,如果您需要仅在控制器中或HttpContext之外提供的内容,您可以创建工厂并将参数传递给工厂

public class MyServiceFactory : IMyServiceFactory
{
    // injecting the HttpContext for request wide service resolution
    public MyServiceFactory(IHttpContextAccessor httpContextAccessor) { ... }
    public IMyService Create(IDependency1 dep1, IDependency2 dep 2, string someRuntimeConfig)
    {
        IServiceProvider provider = this.context.RequestServices;

        var myService = new MyService(provider.GetService<ISomeRepository>(), dep1, dep2, someRuntimeConfig);
        return myService;
    }
}

然后将IMyServiceFactory注入您需要IMyService的课程。