Appearance
静态属性实例化
在不适合将构造函数公开的情况下,可以采用静态属性来实例化。静态属性适用于不需要注入参数的实例化情况。有两种方式
- 带有 [Instance] 标注
- 名称为Instance的属性(不区分大小写)
注意
- 属性的类型必须是当前类型
- 属性必须是public的,必须含有 public get
C#
[Service]
public class T1
{
/// <summary>
/// 名称为Instance的静态属性
/// </summary>
public static T1 Instance
{
get
{
return new T1();
}
}
/// <summary>
/// 私有的构造函数
/// </summary>
private T1() { }
}
[Service]
public class T2
{
private static T2 single;
/// <summary>
/// 带有 [Instance] 标识
/// 当前演示T2类型必须是单例的情况
/// </summary>
[Instance]
public static T2 Singleton
{
get
{
if (single != null)
{
return single;
}
lock (typeof(T2))
{
if (single != null)
{
return single;
}
single = new T2();
return single;
}
}
}
/// <summary>
/// 私有的构造函数
/// </summary>
private T2() { }
}
[Service]
public class T3
{
/// <summary>
/// 带有 [Instance] 标识,并含有版本,当前版本2
/// </summary>
[Instance(2)]
public static T3 Tcp
{
get
{
return new T3("tcp");
}
}
/// <summary>
/// 带有 [Instance] 标识,并含有版本,当前版本1
/// </summary>
[Instance(1)]
public static T3 Udp
{
get
{
return new T3("udp");
}
}
private T3(string protocol) { }
}另外,如果当前类型是泛型类,如果类型参数不同,版本可以相同
C#
[Service]
public class T4<T>
{
/// <summary>
/// 带有 [Instance] 标识,当前类型参数是string
/// </summary>
[Instance]
public static T4<string> StringInstance()
{
return new T4<string>();
}
/// <summary>
/// 带有 [Instance] 标识,当前类型参数是int
/// </summary>
[Instance]
public static T4<int> IntInstance()
{
return new T4<int>();
}
private T4() { }
}注意
泛型类型如果采用静态属性实例化,不同的类型参数都要有自己的静态属性。例如,以上示例中,如果需要 T4<float> 类型时,因为找不到相应的实例化入口,将无法实例化。