2016-04-27 53 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(); 
    } 
} 
相關問題