首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >HttpContextAccessor、IPrincipal和ServiceCollection

HttpContextAccessor、IPrincipal和ServiceCollection
EN

Stack Overflow用户
提问于 2016-04-27 16:14:44
回答 2查看 2.2K关注 0票数 3

有什么办法可以实施下一个行为吗?

代码语言:javascript
运行
复制
public static void Configure(IServiceCollection services) {
    services.AddScoped(typeof(Func<IPrincipal>), ???);
    services.AddInstance(typeof(Func<IPrincipal>), ???);
}

1.不起作用:

代码语言:javascript
运行
复制
Func<IServiceProvider, IPrincipal> getPrincipal = 
    (sp) => sp.GetService<IHttpContextAccessor>().HttpContext.User;

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

2.不起作用:

代码语言:javascript
运行
复制
var builder = services.BuildServiceProvider();

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

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-28 10:01:38

工作解决方案:

代码语言:javascript
运行
复制
Func<IServiceProvider, IPrincipal> getPrincipal = 
    (sp) => sp.GetService<IHttpContextAccessor>().HttpContext.User;

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

    return func;
});
票数 1
EN

Stack Overflow用户

发布于 2016-04-27 17:59:48

代码语言:javascript
运行
复制
Func<IServiceProvider, IPrincipal> getPrincipal = 
    (sp) => sp.GetService<IHttpContextAccessor>().HttpContext.User;

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

您正在尝试解析委托,但我假设您希望解析IPrincipal。我想你的服务可能是这样的

代码语言:javascript
运行
复制
public class MyService : IMyService 
{
    public MyService(IPrincipal principal) 
    {
        ...
    }
}

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

您应该为IPrincipal注册工厂,或者(不太推荐使用imho)将Func<IPrincipal>注入到服务中。

代码语言:javascript
运行
复制
Func<IServiceProvider, IPrincipal> getPrincipal = 
    (sp) => sp.GetService<IHttpContextAccessor>().HttpContext.User;

services.AddScoped<IPrincipal>(getPrincipal); 

或者更短

代码语言:javascript
运行
复制
services.AddScoped<IPrincipal>(
    (sp) => sp.GetService<IHttpContextAccessor>().HttpContext.User
); 

代码语言:javascript
运行
复制
public class MyService : IMyService 
{
    priate IPrincipal principal;
    public MyService(Func<IPrincipal> principalFactory) 
    {
        this.principal = principalFactory();
    }
}
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36895384

复制
相关文章

相似问题

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