【发布时间】:2020-05-26 01:03:37
【问题描述】:
我的目标是根据我将要处理的环境设置用户名字符串:
- 开发和登台环境的任意字符串
-
HttpContext.User.Identity.Name正在生产中。
这是因为我必须能够模拟不同类型的用户,我通过在 UserIdentity 的自定义实现上使用此用户名字符串作为参数调用 FindByIdAsync 方法来实现这一点,如下所示:
public class HomeController : Controller
{
UserManager<AppUser> userManager;
AppUser connectedUser;
public HomeController(UserManager<AppUser> usrMgr, IContextUser ctxUser)
{
connectedUser = usrMgr.FindByNameAsync(ctxUser.ContextUserId).Result;
}
}
我开始为三个常用的开发、登台和生产环境创建三个appsettings.{environment}.json 文件; development 和 staging .json 文件都有这个配置:
...
"Data": {
...
"ConnectedUser" : "__ADMIN"
}
...
而生产环境配置文件没有有这个key。
我已经创建了一个简单的界面
public interface IContextUser
{
public string ContextUserId { get; }
}
及其实现:
public class ContextUser : IContextUser
{
string contextUser;
IHttpContextAccessor contextAccessor;
public ContextUser(IHttpContextAccessor ctxAccessor, string ctxUser = null)
{
contextUser = ctxUser;
contextAccessor = ctxAccessor;
}
public string ContextUserId => contextUser ?? contextAccessor.HttpContext.User.Identity.Name;
}
现在,我想到了在Startup 类中简单地配置ConfigureServices 方法:
public void ConfigureServices(IServiceCollection services)
{
// --- add other services --- //
string ctxUser = Configuration["Data:ConnectedUser"];
services.AddSingleton(service => new ContextUser( ??? , ctxUser ));
}
但它需要一个IHttpContextAccessor 对象,这在应用程序的这个阶段似乎不可用。我该如何解决这个问题?
【问题讨论】:
标签: asp.net-core dependency-injection