【发布时间】:2020-01-10 00:40:24
【问题描述】:
我有以下类,我想在带有 DI 的 .NET Core 中使用它
public class DefaultSettingsProvider : ISettingsProvider
{
private static DefaultSettingsProvider _instance = null;
private string _fileName = "blundergat.settings";
private DefaultSettingsProvider() { }
public static DefaultSettingsProvider Instance
{
get
{
if (_instance == null)
{
_instance = new DefaultSettingsProvider();
if (File.Exists(_instance.GetSerializedFilePath()))
{
DefaultSettingsProvider o = _instance.Deserialize();
_instance = o ?? _instance;
}
_instance.RestoreDefaults();
}
return _instance;
}
}
public void Save()
{
(this as ICustomXmlSerializableObject).Serialize();
}
public string GetSerializedFilePath()
{
return Path.Combine(Environment.CurrentDirectory, _fileName);
}
public void RestoreDefaults(bool force = false)
{
if (DataSourceSettings == null || force)
DataSourceSettings = new DataSourceSettings();
if (IcpSolverSettings == null || force)
IcpSolverSettings = new IcpSolverSettings();
}
[XmlElement, Browsable(false)]
public DataSourceSettings DataSourceSettings { get; set; }
[XmlElement, Browsable(false)]
public IcpSolverSettings IcpSolverSettings { get; set; }
}
与
public interface ISettingsProvider : ICustomXmlSerializableObject
{
void Save();
void RestoreDefaults(bool force = false);
}
我通过哪里配置 DI
var serviceProvider = new ServiceCollection()
.AddSingleton<IHostedService, CoreHostingService>()
.AddSingleton<ISolverManagementService, SolverManagementService>()
.AddSingleton<IDepthMapToPointCloudAdapter, DepthMapToPointCloudAdapter>()
.AddSingleton<IIcpBatchSolverService, IcpBatchSolverService>()
.AddSingleton<ISettingsProvider, DefaultSettingsProvider>()
.AddLogging(builder =>
{
builder.SetMinimumLevel(LogLevel.Trace);
builder.AddSerilog(Log.Logger);
})
.BuildServiceProvider();
这显然不能按我的要求工作,所以我试图将类更改为这个
public class DefaultSettingsProvider : ISettingsProvider
{
private static DefaultSettingsProvider instance = null;
private string _fileName = "blundergat.settings";
public DefaultSettingsProvider()
{
if (instance == null)
{
instance = this;
if (File.Exists(instance.GetSerializedFilePath()))
{
DefaultSettingsProvider o = instance.Deserialize();
instance = o ?? instance;
}
instance.RestoreDefaults();
}
}
public void Save()
{
(this as ICustomXmlSerializableObject).Serialize();
}
public string GetSerializedFilePath()
{
return Path.Combine(Environment.CurrentDirectory, _fileName);
}
public void RestoreDefaults(bool force = false)
{
if (DataSourceSettings == null || force)
DataSourceSettings = new DataSourceSettings();
if (IcpSolverSettings == null || force)
IcpSolverSettings = new IcpSolverSettings();
}
[XmlElement, Browsable(false)]
public DataSourceSettings DataSourceSettings { get; set; }
[XmlElement, Browsable(false)]
public IcpSolverSettings IcpSolverSettings { get; set; }
}
这适用于 DI,但是由于我使用静态“实例”而无法正确初始化设置,所以当我尝试这样做时
public A(ISettingsProvider sp)
{
string someSetting = sp.DataSouceSettings.DataPath;
}
DataSouceSettings 为 null,因为它未初始化。如何将instance.DataSouceSettings 与sp.DataSouceSettings 对齐?本质上,我怎样才能修改这个类以使用 DI,同时又能像使用经典单例模式那样操作?
附言。为了完整性。
[Serializable]
public class DataSourceSettings
{
public DataSourceSettings()
{
BaseDirectory = String.Empty;
}
[XmlElement, Browsable(false)]
public string BaseDirectory { get; set; }
}
【问题讨论】:
-
您已经将它作为单例添加到 DI,所以我认为在类实现中保留单例代码没有意义。