2016-04-27 52 views
0

有没有一种方法可以实现下一个行为?HttpContextAccessor,IPrincipal和ServiceCollection

public static void Configure(IServiceCollection services) { 
    services.AddScoped(typeof(Func<IPrincipal>), ???); 
    services.AddInstance(typeof(Func<IPrincipal>), ???); 
} 

1.不起作用:

Func<IServiceProvider, IPrincipal> getPrincipal = 
    (sp) => sp.GetService<IHttpContextAccessor>().HttpContext.User; 

services.AddScoped(
    typeof(Func<IPrincipal>), 
    getPrincipal); 

2.不起作用:

var builder = services.BuildServiceProvider(); 

services.AddInstance(
    typeof(Func<IPrincipal>), 
    builder.GetService<IHttpContextAccessor>().HttpContext.User); 
+1

什么是你想达到什么目的?目前还不清楚你需要什么样的最终结果。例如,你想有一个服务返回当前用户? –

回答

0

工作液:

Func<IServiceProvider, IPrincipal> getPrincipal = 
    (sp) => sp.GetService<IHttpContextAccessor>().HttpContext.User; 

services.AddScoped(typeof(Func<IPrincipal>), sp => { 
    Func<IPrincipal> func =() => { 
     return getPrincipal(sp); 
    }; 

    return func; 
}); 
+0

您不需要将其包裹在代表中。 'AddScoped'有两个重载。一个可以传递具体类型的地方,另一个传递工厂方法的地方。当使用工厂重载时,每次需要实例化类型时都会调用工厂。还是有一个特别的原因,你为什么需要它作为代表? – Tseng

+0

在我目前的任务中,我必须在构造函数中注入'Func '作为参数 – FSou1

2
Func<IServiceProvider, IPrincipal> getPrincipal = 
    (sp) => sp.GetService<IHttpContextAccessor>().HttpContext.User; 

services.AddScoped(
    typeof(Func<IPrincipal>), 
    getPrincipal); 

您正在试图解决的委托,但我假设你想要解决IPrincipal。我假设您的服务可能如下所示

public class MyService : IMyService 
{ 
    public MyService(IPrincipal principal) 
    { 
     ... 
    } 
} 

如果是这样,那么您的注册是错误的。您正在注册Func<IPrincipal>,但预计未注册IPrincipal

您应该为工厂注册IPrincipal或(推荐不到的imho)将Func<IPrincipal>注入您的服务。

Func<IServiceProvider, IPrincipal> getPrincipal = 
    (sp) => sp.GetService<IHttpContextAccessor>().HttpContext.User; 

services.AddScoped<IPrincipal>(getPrincipal); 

或更短

services.AddScoped<IPrincipal>(
    (sp) => sp.GetService<IHttpContextAccessor>().HttpContext.User 
); 

public class MyService : IMyService 
{ 
    priate IPrincipal principal; 
    public MyService(Func<IPrincipal> principalFactory) 
    { 
     this.principal = principalFactory(); 
    } 
} 
相关问题