asp.net-core-2.0 - 使用 DI 的 ASP.NET CORE 2.0 运行时值
问题描述
在 ASP.NET CORE 2.0 中,如何将动态连接字符串等运行时参数(字符串类型)作为依赖注入传递给我的服务。字符串参数值将是动态的并取自 HttpContext。
我无法理解如何使用来自 Controller->Service->Repository 类的 DI 传递运行时参数值?
下面的代码是我正在使用的。请指导我。
代码
public class AccountController : BaseController//Controller
{
ILogger<AccountController> _logger;
private IUserService _userService;
public AccountController(
ILogger<AccountController> logger
, IUserService userService
) {
_logger = logger;
_userService = userService;
}
public class UserService : IUserService
{
private readonly IUserRepository _userRepository;
private readonly IRoleRepository _roleRepository;
public UserService(
IUserRepository userRepository
,IRoleRepository roleRepository
)
{
_userRepository = userRepository;
_roleRepository = roleRepository;
}
public class UserRepository : DbProvider, IUserRepository
{
private IConfiguration _configuration;
private DatabaseSetting _databaseSetting;
public UserRepository(IConfiguration configuration, IOptions<DatabaseSetting> databaseSetting) : base(configuration, databaseSetting)
{
_configuration = configuration;
_databaseSetting = databaseSetting.Value;
}
public static class StartupExtensions
{
public static IServiceCollection AddCloudscribeCore(this IServiceCollection services, IConfiguration configuration)
{
// Add application repository.
services.AddSingleton<AuthAttributeFilter>();
#region Add Repository Dependency Here
services.AddTransient<IUserRepository, UserRepository>();
services.AddTransient<IRoleRepository, RoleRepository>();
#endregion Repository Dependency
#region Add Service Dependency Here
services.AddTransient<ICompanyService, CompanyService>();
services.AddTransient<IUserService, UserService>();
#endregion Service Dependency
services.Configure<DatabaseSetting>(options =>
{
options.DBProvider = configuration["DatabaseSetting:DBProvider"];
options.ConnectionString = configuration["DatabaseSetting:ConnectionString"];
});
return services;
}
}
解决方案
HttpContext
在Service
and中访问Repository
,不需要从 Controller 传递,try IHttpContextAccessor
。
public class UserRepository : DbProvider, IUserRepository
{
private IConfiguration _configuration;
private DatabaseSetting _databaseSetting;
private readonly IHttpContextAccessor _accessor;
public UserRepository(IConfiguration configuration, IOptions<DatabaseSetting> databaseSetting, IHttpContextAccessor accessor) : base(configuration, databaseSetting)
{
_configuration = configuration;
_databaseSetting = databaseSetting.Value;
_accessor = accessor;
}
然后,您可以HttpContext
通过_accessor.HttpContext
.
推荐阅读
- ruby-on-rails - Rails 5 Active Model Serializer 显示在 JSON 中有很多条件
- python - Seaborn 的箱线图胡须含义
- kubernetes - 解析 Kubernetes 环境变量中的服务名称
- django - 'error': 'invalid_request', 'error_description': '无效的 grant_type 参数或缺少参数'
- react-native - 动作必须是普通对象。在 React Native 中使用客户中间件进行异步操作
- reactjs - 无法设置状态 - 尝试使用 Axios、AJAX 和 fetch()
- c# - DateTime 类中的 Stander "s" 说明符
- java - java stringbuilder删除一行
- spring - 如何在 Spring 中发送带有多部分文件的 json?
- python-2.7 - 如何获得带有动态标签的计时器?