我想创建一个存储一些数据的单件工厂。部分数据来自XML文件,其中一部分是硬编码的。
我被建议定义一个包含数据并让我的类实现它的接口IMyConfigData
。
这是一个好设计吗?定义和实现接口的优点是什么,而不是直接在类中包含数据?
我想在访问类属性时使下面的单例线程安全吗?我该如何实现这个目标?
IMyConfigData
中有两个字段,即EntityIdSite
和EntityIdApplication
。我将这两个组合成一个名为EntityId
的类,其中包含Site
和Application
。以这种方式组合元素是否会影响XML的序列化?
接口:
public class EntityId
{
ushort Site { get; set; }
ushort Application { get; set; }
}
public interface IMyConfigData
{
//ushort EntityIdSite { get; set; }
//ushort EntityIdApplication { get; set; }
EntityId entityId {get; set;}
ushort ETypeCountry { get; set; }
byte ETypeCategory { get; set; }
byte ETypeSubCategory { get; set; }
UInt32 PortNumber { get; set; }
}
XML:
<?xml version="1.0" encoding="utf-8" standalone="no" ?>
<Configuration xmlns="http://test.com/MyConfiguration">
<Settings>
<setting owner="MySServer" name="AllowEditOnAreas" value="0"/>
<Setting owner="MySServer" name="ApplicationId" value="10"/>
<Setting owner="MyServer" name="Port" value="3000"/>
</Settings>
</Configuration>
实现:
public sealed class Singleton : IMyConfigData
{
private static readonly Lazy<Singleton> lazy =
new Lazy<Singleton>(() => new Singleton());
public static Singleton Instance
{
get {
return lazy.Value;
}
}
private Singleton()
{
}
}
答案 0 :(得分:0)
Singleton - 一个类只有一个实例,并提供对它的全局访问点。
以下是我的回答:
1)由于您的类只有一个实例,因此无需将其声明为Interface。而且你的类有属性没有任何方法。
2)为了使其线程安全以支持多线程应用程序,请使用lock来检查同步
private static object syncLock = new object();
lock (syncLock)
{
if (_instance == null)
{
_instance = new Singleton();//class to be initialized once
}
}
3)以这种方式组合元素是否会影响XML的序列化? 这应该不会对序列化产生重大影响。如果在其他地方没有使用EntityId,那么最好将这些属性移回主类。
这是完整的样本。
public class MyConfigData
{
ushort EntityIdSite { get; set; }
ushort EntityIdApplication { get; set; }
ushort ETypeCountry { get; set; }
byte ETypeCategory { get; set; }
byte ETypeSubCategory { get; set; }
public UInt32 PortNumber { get; set; }
private static MyConfigData _instance;
// Lock synchronization object
private static object syncLock = new object();
protected MyConfigData()
{
}
public static MyConfigData GetInstance()
{
if (_instance == null)
{
lock (syncLock)
{
if (_instance == null)
{
_instance = new MyConfigData();
}
}
}
return _instance;
}
}
使用下面显示的静态方法获取此类的引用。将该物业公开为公共场所,无论哪个都需要在课外进行。例如,在这种情况下,我将PortNumber声明为public。
MyConfigData configData = MyConfigData.GetInstance();
var port = configData.PortNumber;