我正在审查我之前编写的代码,我注意到我过去曾这样做过 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
容器中。
- 1 回答
- 0 关注
- 78 浏览
添加回答
举报
0/150
提交
取消