首页 > 解决方案 > 使用 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;
        }
}

标签: asp.net-core-2.0

解决方案


HttpContextServiceand中访问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.


推荐阅读