【问题标题】:.NET Core Configuration is forcing me to DependencyInjection.NET Core 配置迫使我使用 DependencyInjection
【发布时间】:2020-05-22 00:58:16
【问题描述】:

我想阅读 appsettings.json 非控制器类。考虑有一个 DatabaseUtil 并包含一个静态 connect() 方法。我需要connectionString进行连接,我从appsettings.json得到这个。startup.cs中的这个操作小菜一碟:) 像这样:

Configuration.GetConnectionString("HangfireDBConn")

它也可以在控制器端进行依赖注入。但我的问题是想从 DatbaseUtil 类到达 appSettings。 appSettings.json:

"NotifySettings": {
        "DbConnection": "abc",
        "Email": "abc@domain.com",
        "SMTPPort": "5605"
    }

然后我创建了我的配置设置类:

 public class NotifySettings 
    {
        public string DbConnection { get; set; }
        public string Email { get; set; }
        public string SMTPPort { get; set; }
    }

我将构造函数注入的依赖添加到DatabaseUtil 类并添加了IDatabaseUtil

public  class DatabaseUtil : IDatabaseUtil
    {
        private static NotifySettings _NotifySettings;

        public DatabaseUtil(IConfiguration _iconfig)
        {
            _NotifySettings = _iconfig.GetSection("NotifySettings").Get<NotifySettings>();
        }
        public static String ConnectToDatabase()
        {
            return "MESSAGE :" + _NotifySettings.DbConnection; 
        }

    }
}

我将 DatabaseUtil 添加到 startup.cs

 services.AddScoped<IDatabaseUtil, DatabaseUtil>();

最后,我将 IDatabaseUtil 注入到我的控制器类中,我可以完成这项工作的 mysettings 结束。 是的,我可以,但不是最好的方法!

让加入我的头脑风暴:) ;如果我必须向 IDatabaseUtil 注入我想使用 db 辅助方法的每个类。但是如果我在这个类中有一个静态方法,它只需要这行代码:

DatabaseUtils.connect();   

感觉就像我写了不必要的代码。

您如何看待我的近似值。哪种方法最适合这种情况?

【问题讨论】:

  • 您好 Onur:正如所写,这在很大程度上是一个主观评论,没有要解决的问题,因为除了描述依赖注入与静态实例之外,没有任何关于您的“案例”的真实上下文。是否有关于 DI 的具体问题?查看What types of questions should I avoid asking?
  • 如果您有静态数据访问方法,那么您编写了不必要的代码 - 删除它。仅当您决定抽象数据库方法时才使用此代码。
  • 感谢您提供有用的反馈@AdamG 实际上我的问题是关于近似值,有点高兴有问题。但如果您期望真正的问题问题可能是这样的:我如何到达 appsettings.json 文件我的 DatabaseUtil 类具有静态辅助方法(我想使用设置模型,我知道其他类型的解决方案)。

标签: c# .net api .net-core dependency-injection


【解决方案1】:

改变

services.AddScoped<IDatabaseUtil, DatabaseUtil>();

services.AddSingleton<IDatabaseUtil, DatabaseUtil>();

这样你只有一个 DatabaseUtil 实例

【讨论】:

  • 谢谢阿伦,但这与我的问题解决方案无关。但它帮助我学习了一些东西
【解决方案2】:

我仍然不完全清楚,但如果这里需要使您的配置中的值静态可用,那么在启动期间将它们从您的配置复制到静态类:

public static class GlobalSettings 
{
    public static string ConnectionString { get; set; }
}

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        GlobalSettings.ConnectionString = Configuration.GetSection("ConnectionString").Value;
        // ...
    }
}

如果您需要从其他地方获取配置并执行分配,请使用ConfigurationBuilder

var config = new ConfigurationBuilder()
        .AddJsonFile("appsettings.json")
        .Build();

【讨论】:

  • (或者,考虑采用依赖注入和抽象!)
  • 看起来你对我理解得很好,但我想再说一遍,想像这样使用设置模型: public class NotifySettings { public string DbConnection { get;放; } 公共字符串电子邮件 { 获取;放; } 公共字符串 SMTPPort { 获取;放; } }
  • 如果您想要完整模型,则将字符串更改为您的设置并绑定完整模型。 NotifySettings settings = new NotifySettings(); Configuration.GetSection("NotifySettings").Bind(settings); GlobalSettings.NotifySettings = settings;
【解决方案3】:
using System;
using Microsoft.Extensions.Configuration;

namespace project.Utility
{
    public class ConnectionString
    {
        private IConfigurationRoot _config;
        private static ConnectionString _internalInstance;

        public static ConnectionString Instance
        {
            get
            {
                return _internalInstance;
            }
        }

        public static void Init(IConfigurationRoot config)
        {
            _internalInstance = new ConnectionString();
            _internalInstance._config = config;
        }

        public String Get(string key)
        {

         var NotifySettings = 
                Instance._config.GetSection(key).Get<NotifySettings>();;
            return NotifySettings;
        }
    }
}

// call this above method from any place like controller or class file by below code 
// use refernece of the namespace
ConnectionString connectionString = new ConnectionString(); // object creation
NotifySettings settings = connectionString.Get("NotifySettings"); // call with your key value  get the settings object

试试这个应该可以,如果有任何问题可以帮助我,请告诉我

【讨论】:

    猜你喜欢
    • 2018-01-30
    • 2020-11-01
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-13
    • 2017-11-29
    • 1970-01-01
    相关资源
    最近更新 更多