【问题标题】:How to Pass IConfiguration from API controller to Data Access Layer如何将 IConfiguration 从 API 控制器传递到数据访问层
【发布时间】:2019-05-26 01:46:18
【问题描述】:

我是 ASP.net 核心的新手,正在尝试将我现有的 RESTful WepAPI 转换为 ASP.Net Core API (2.2)。

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

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

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

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

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

到目前为止,我想出了以下几点:

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

  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;
    }
    

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

如果这是一种不正确的方法,请告诉我,以及实现此目的的正确方法应该是什么。

【问题讨论】:

  • 在 startup.cs 文件中发布您用于 DI 注册的确切代码。另外,如何或谁为 ConnectionFactory 创建对象?

标签: asp.net-core


【解决方案1】:

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

  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. Startup.cs注册ConnectionFactory

    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>();
    }
    

【讨论】:

    猜你喜欢
    • 2020-10-06
    • 1970-01-01
    • 2019-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    • 2017-07-12
    相关资源
    最近更新 更多