繁体   English   中英

理解HttpContext.User的WebAPI DI框架

[英]WebAPI DI Framework that understands HttpContext.User

我正在寻找可以满足这种情况的DI框架:

每个控制器都有这样的构造函数

public ThisController( ThatRepository repo)

每个存储库都有一个像这样的控制器:

public ThatRepository (DataSource ds)

有一个主数据源,但是永远不会传递到存储库。 相反,它需要:

MasterDataSource.WithUser ( httpContext?.User?.Identity?.Name )

是否有用于WebAPI的直接支持的DI框架?

我相信您可以将几乎每个DI容器用于此目的,方法是在容器内注册当前的HttpContext (或什至当前的用户Identity ),然后将其注入以构造DataSource实例。

这是在SimpleInjector中使用HttpContext的简单解决方案(您可以轻松地将代码移植到所需的任何DI框架):

container.Register<HttpContextBase>(() =>
    new HttpContextWrapper(HttpContext.Current), 
    Lifestyle.Scoped);

container.Register<DataSource>(() =>
    {
        var httpContext = container.GetInstance<HttpContextBase>();
        return MasterDataSource.WithUser(httpContext?.User?.Identity?.Name);
    }, 
    Lifestyle.Scoped);

在您控制的接口后面抽象HttpContext ,并让您选择的DI容器在需要时解决该问题。

public interface ICurrentUser {
    string Name{get;}
}

该接口的具体实现如下所示:

public class UserProvider : ICurrentUser {
    HttoContextBase httpContext;
    UserProvider(){
        httpContext = HttpContext.Current;
    }
    public string Name { 
        get{ return httpContext?.User?.Identity?.Name ?? string.Empty; } 
    }
}

您可以使用DI容器注册接口/合同,并在需要DataSource时解决它。

public void SomeSetupMethod(ICurrentUser user) {
    MasterDataSource.WithUser(user?.Name);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM