为了账号安全,请及时绑定邮箱和手机立即绑定

在 .NET 应用程序中注入配置对象

在 .NET 应用程序中注入配置对象

C#
蓝山帝景 2023-09-09 14:57:50
我正在审查我之前编写的代码,我注意到我过去曾这样做过  public class Linq2DbSettings : ILinqToDBSettings{    public IEnumerable<IDataProviderSettings> DataProviders    {        get { yield break; }    }    public string DefaultConfiguration =>        "SqlServer"; // lets set your configuration as default, so you can call just new DataContext() or new DataConnection()    public string DefaultDataProvider => ProviderName.SqlServer; // and set default database type    public IEnumerable<IConnectionStringSettings> ConnectionStrings    {        get        {            yield return                new ConnectionStringSettings                {                    Name = "SqlServer",                    ProviderName = "SqlServer",                    ConnectionString =ConfigurationManager.ConnectionStrings["default"].ConnectionString                };        }    }}public class ConnectionStringSettings : IConnectionStringSettings{    public string ConnectionString { get; set; }    public string Name { get; set; }    public string ProviderName { get; set; }    public bool IsGlobal => false;}即使它与 Linq2Db 相关,它也适用于我需要解析容器的所有类。正如你所看到的,我在这里使用ConfigurationManager.ConnectionStrings["default"],而最好使用IConfiurationfromMicrosoft.Extensions.Configuration为此,我应该解析IConfiguration在 SimpleInjector 的容器中注册的项目。过去我用过包装纸public static class ContainerWrapper{    public static Container Container { get; set; }}我将其指定为    ContainerWrapper.Container = container;    container.Verify();但我认为这是一个错误的方法,最好的解决方案是什么?
查看完整描述

1 回答

?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

我的建议如下:

  • 保持你的配置对象范围窄;不要创建包含大量属性并被许多使用者使用的宽配置对象。

  • 防止配置对象从配置系统中读取。相反,使它们成为不可变的无行为数据对象,并在其构造函数中为它们提供配置值。这可以防止配置对象成为易失性依赖项。

  • 删除配置对象上的接口。接口旨在隐藏行为,但配置对象应该只包含数据。

  • 在应用程序启动期间加载配置值,并将这些配置对象注册到Singleton容器中。


查看完整回答
反对 回复 2023-09-09
  • 1 回答
  • 0 关注
  • 78 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信