【问题标题】:Access appsettings.json file setting from the class library project从类库项目访问 appsettings.json 文件设置
【发布时间】:2017-01-18 01:02:14
【问题描述】:

我知道如何在 web 项目中设置appsettings.json 文件。但是你能告诉我如何从类库项目中访问它吗?

我可以在 web 项目上如下所示配置它。那么如何从类库项目中访问该值?这可能吗?

public class MyConfig
{
    public string ApplicationName { get; set; }
    public int Version { get; set; }
}

public class Startup 
{
    public IConfigurationRoot Configuration { get; set; }

    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)

        Configuration = builder.Build();
    }
}

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();

    // Add functionality to inject IOptions<T>
    services.AddOptions();

    // Add our Config object so it can be injected
    services.Configure<MyConfig>(Configuration);
}

public class HomeController : Controller
{
    private readonly IOptions<MyConfig> config;

    public HomeController(IOptions<MyConfig> config)
    {
        this.config = config;
    }

    // GET: /<controller>/
    public IActionResult Index() => View(config.Value);
}

【问题讨论】:

    标签: c# asp.net-core asp.net-core-mvc


    【解决方案1】:

    你需要获取section然后绑定,修改这个

    // Add our Config object so it can be injected
    services.Configure<MyConfig>(Configuration);
    

    // Add our Config object so it can be injected
    services.Configure<MyConfig>(option => Configuration.GetSection("MyConfig").Bind(option));
    

    然后您将在HomeController 或您注入它的任何其他地方获得值。

    public class HomeController : Controller
    {
    
        private readonly IOptions<MyConfig> config;
    
        public HomeController(IOptions<MyConfig> config)
        {
            this.config = config;
        }
    
        public IActionResult Index()
        {
            var value = config.Value.ApplicationName;
            var vars = config.Value.Version;
            return View();
        }
    }
    

    appsettings.json

    {
      "Logging": {
        "IncludeScopes": false,
        "LogLevel": {
          "Default": "Debug",
          "System": "Information",
          "Microsoft": "Information"
        }
      },
      "MyConfig": {
        "ApplicationName": "My Application Name",
        "Version": 1
      }
    }
    

    我们如何称呼这个网络项目?

    Asp.Net Core DI 在创建控制器之前解析所有依赖项。所以,我们可以创建一个接口并实现它。然后我们可以将其注入控制器并从那里访问appsettings.json 设置。

    ICategory.cs

    public interface ICategory
    {
        IOptions<MyConfig> config;
        IQueryable<Categories> Get();
    }
    

    Category.cs

    public class Category : ICategory
    {
           private readonly IOptions<MyConfig> config;
    
           public Category(IOptions<MyConfig> config)
           {
                this.config = config;
           }
           public Categories Get(long id)
           {
                var value = config.Value.ApplicationName;
                var vars = config.Value.Version;
                return category;
          }
    }
    

    CategoryController.cs

    public CategoriesController(ICategory category)
    {
       this.category = category;
    }
    

    当我们调用category.Get() 方法时,我们可以访问该方法中的appsettings.json 设置。

    Startup.csConfigureServices方法中注册

    services.AddTransient<ICategory, Category>();
    

    【讨论】:

    • 你能告诉我如何将它注入到另一个项目的类文件中吗?是的,我们可以在您展示的 Web 项目中做到这一点。但是如何使用另一个类库项目来做到这一点?在我有多个类库项目的同一解决方案下。
    • 我添加了一个例子,请检查。
    • @Ahmar...IOptions config;,在 ICategory 接口中 -- 错误...接口不能包含字段
    • @Ahmar... 该接口在我的类库项目中,DatabaseSettings 类也在该项目中。
    • 这里没有解释如何在同一个解决方案中注入一个完全不同的项目中的接口。
    猜你喜欢
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 2017-07-04
    • 2015-12-27
    相关资源
    最近更新 更多