Skip to content

静态属性实例化

在不适合将构造函数公开的情况下,可以采用静态属性来实例化。静态属性适用于不需要注入参数的实例化情况。有两种方式

  1. 带有 [Instance] 标注
  2. 名称为Instance的属性(不区分大小写)

注意

  1. 属性的类型必须是当前类型
  2. 属性必须是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> 类型时,因为找不到相应的实例化入口,将无法实例化。

沪ICP备2025119739号