如何将IConfiguration从API控制器传递到数据访问层

时间:2018-12-28 07:24:33

标签: asp.net-core

我是ASP.net Core的新手,并试图将现有的RESTful WepAPI转换为ASP.Net Core API(2.2)。

以下是我目前的应用程序结构: [WebAPI方法]调用-> [业务逻辑层(BLL)]调用-> [数据访问层(DAL)]。

为了从DAL打开数据库连接,我正在调用另一个类库(Infrstructure.Data.dll)的静态方法,并将连接字符串名称作为Enum传递。该库使用以下命令从webAPI的Web.Config获取实际的连接字符串

string connString = ConfigurationManager.ConnectionStrings[GetDatabaseHint(dbSource)].ConnectionString;

并返回IDbConnection,我的DAL使用该IDbConnection与DB进行交易。

现在,我正在ASP.net核心Web API中寻找类似的选项。

到目前为止,我提出了以下建议:

  1. 在API的Startup.cs文件中,添加了 services.AddSingleton(Configuration);

  2. 在Infrstructure.Data.dll类库中添加

    private static IConfiguration _config;
    public ConnectionFactory(IConfiguration config)
    {
        _config = config;
    }
    
    public static IDbConnection GetConnection(DBSource dbSource)
    {
        string connString = _config.GetConnectionString(GetDatabaseHint(dbSource));
    
    
        //... Code to create connection using DB Providers
    
        return conn;
    }
    

在此Infrstructure.Data.dll中,IConfiguration始终为空。

如果万一这是​​不正确的方法,请告诉我,什么是实现此目的的正确方法。

1 个答案:

答案 0 :(得分:0)

请按照以下步骤访问IConfiguration中的Infrstructure.Data

  1. 定义ConnectionFactory

    public class ConnectionFactory
    {
        private static IConfiguration _config;
        public ConnectionFactory(IConfiguration config)
        {
            _config = config;
        }
        public string GetConnection()
        {
            return _config.GetConnectionString("any connection string name");
        }
        //public static IDbConnection GetConnection(DBSource dbSource)
        //{
        //    return new dbc
        //}
    }
    
  2. ConnectionFactory中注册Startup.cs

    services.AddScoped<ConnectionFactory>();
    
  3. 使用情况

    public class HomeController : Controller
    {
        private ApplicationDbContext _context;
        private readonly ConnectionFactory connectionFactory;
        public HomeController(ApplicationDbContext context
            , ConnectionFactory connectionFactory)
        {
            _context = context;
            this.connectionFactory = connectionFactory;
        }
        public IActionResult Index()
        {
            string result = connectionFactory.GetConnection();            
            return View();
        }
    }
    

    注意 IConfiguration已将WebHost.CreateDefaultBuilder(args)默认注册为

    public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }
    
        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>();
    }