Skip to content

静态方法实例化

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

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

注意

  1. 静态方法的返回值必须是当前类型
  2. 静态方法必须是public的
C#
[Service]
public class T1
{
    /// <summary>
    /// 名称为GetInstance的静态方法
    /// </summary>
    /// <param name="dataSource">静态方法的参数,必须是容器管理的类型</param>
    /// <returns>实例</returns>
    public static T1 GetInstance(DataSource dataSource)
    {
        return new T1(dataSource);
    }

    /// <summary>
    /// 私有的构造函数
    /// </summary>
    private T1(DataSource dataSource) { }
}

[Service]
public class T2
{
    private static T2 single;

    /// <summary>
    /// 带有 [Instance] 标识
    /// 当前演示T2类型必须是单例的情况
    /// </summary>
    /// <returns>实例</returns>
    [Instance]
    public static T2 Singleton()
    {
        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>
    /// <returns></returns>
    [Instance(2)]
    public static T3 Tcp()
    {
        return new T3("tcp");
    }

    /// <summary>
    /// 带有 [Instance] 标识,并含有版本,当前版本1
    /// </summary>
    /// <returns></returns>
    [Instance(1)]
    public static T3 Udp()
    {
        return new T3("udp");
    }
    /// <summary>
    /// 私有的构造函数
    /// </summary>
    private T3(string protocol){}

}

另外,如果当前类型是泛型类,如果类型参数不同,版本可以相同

C#
[Service]
public class T4<T>
{

    /// <summary>
    /// 带有 [Instance] 标识,当前类型参数是string
    /// </summary>
    /// <returns>实例</returns>
    [Instance]
    public static T4<string> StringInstance()
    {
        return new T4<string>();
    }

    /// <summary>
    /// 带有 [Instance] 标识,当前类型参数是int
    /// </summary>
    /// <returns>实例</returns>
    [Instance]
    public static T4<int> IntInstance()
    {
        return new T4<int>();
    }
    /// <summary>
    /// 私有的构造函数
    /// </summary>
    private T4() { }
}

注意

泛型类型如果采用静态函数实例化,不同的类型参数都要有自己的静态函数。例如,以上示例中,如果需要 T4<float> 类型时,因为找不到相应的实例化入口,将无法实例化。

沪ICP备2025119739号