猿问

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

我正在审查我之前编写的代码,我注意到我过去曾这样做过


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

但我认为这是一个错误的方法,最好的解决方案是什么?


蓝山帝景
浏览 79回答 1
1回答

拉风的咖菲猫

我的建议如下:保持你的配置对象范围窄;不要创建包含大量属性并被许多使用者使用的宽配置对象。防止配置对象从配置系统中读取。相反,使它们成为不可变的无行为数据对象,并在其构造函数中为它们提供配置值。这可以防止配置对象成为易失性依赖项。删除配置对象上的接口。接口旨在隐藏行为,但配置对象应该只包含数据。在应用程序启动期间加载配置值,并将这些配置对象注册到Singleton容器中。
随时随地看视频慕课网APP
我要回答