问题描述如下://有一个单例类,运行在Web服务器端,有WebServcie和一些其他的类对其进行调用。
    public class DataManagerService
    {
        private string userID = "TestID";        private DataManagerService instance = null;        public DataManagerService Instance
        {
            get
            {
                if (instance == null)
                    instance = new DataManagerService();
                return instance;
            }            
        }        private DataManagerService()
        {
        }        public void SomeFunction1()
        {
            //有些操作需要userID
        }
        public void SomeFunction1()
        {
            //操作
        }
        public void SomeFunction2()
        {
            //操作   有些操作需要userID
        }
        public void SomeFunction3()
        {
            //操作
        }
        public void SomeFunction4()
        {
            //操作
        }现在有一个新的需求出现,有一个新的类也要对这个单例进行调用。但是不同点在于,原来单例类中的userID是一个固定值。新的需求需要将userID,动态的变化。
实例中的很多函数都会调用userID,最好不要使用函数重载的方法来对函数内部进行传参。因为实例内部的函数非常多,改动非常多。请问大家有什么好的实现办法?

解决方案 »

  1.   

    private   DataManagerService   instance1   =   null;  
    public   DataManagerService   XXX(sring uid)

        if   (instance1   ==   null) 
            instance1   =   new   DataManagerService(uid);
        return   instance1;                       
    } private   DataManagerService(string uid) 

        this.userID = uid;
      

  2.   

    如果你需要同一个单例的话,也就是不能new 一个instance1 的话
    你可以在方法里面用反射的办法,给userID赋值~~~~~~
      

  3.   

     public class Singleton<T>
        {
            private static T _instance;        public Singleton()
            {
            }        public static T Instance
            {
                get
                {
                    if (_instance == null)
                    {                             _instance = (T)System.Activator.CreateInstance(typeof(T));
                    }
                    return _instance;
                }
            }
        }
      

  4.   

    lovefootball ,
    应该用静态的实例吧private   static    DataManagerService       instance1       =       null;     
    public    static   DataManagerService       XXX(sring   uid) 
    {   
            if       (instance1       ==       null)   
                    instance1       =       new       DataManagerService(uid); 
            return       instance1;                                               
    }   private       DataManagerService(string   uid)   
    {   
            this.userID   =   uid; 
    }   
      

  5.   

    "你可以在方法里面用反射的办法,给userID赋值~~~~~~"请稍作解释!
      

  6.   

    恩,对的,应该静态,不过如果你不需要重新new一个的话,最好还是这样
     
    public static DataManagerService   Instance 

        get 
        { 
            if   (instance   ==   null) 
                instance   =   new   DataManagerService(); 
            return   instance; 
        }                         

    public static DataManagerService GetInstance()
    {
        if (instance == null) 
        {
            instance = new DataManagerService();
        }
        return instance;
    }public static DataManagerService GetInstance(string uid)
    {
        DataManagerService temp = GetInstance();
        //利用反射给userid赋值
        return temp;
    }
      

  7.   

    反射给私有变量赋值请参考
    Type mytype = typeof(DataManagerService);
    FieldInfo fieldinfo = mytype.GetField("userID", 
        BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);
    if (fieldinfo != null)
    {
        fieldinfo.SetValue(temp, "111");
        String ss = (string)fieldinfo.GetValue(temp);
        Console.WriteLine(ss);
    }
    把这段Source放在上面注释的地方就可以了
      

  8.   

    提供一个对外访问userID的方法,然后强制性的在更改userID之后将值设置回初始值.
    public string getuserID()
    {
        ...
    }
    public string setuserID()
    {
        ...
    }
    使用时get方法和set方法必须成对出现.
    只能用这种方式了.
      

  9.   

    哦我刚刚想到了一种解决方案:
    声明一个包装类:
    public class userIDChanger
    {
        private father_userID=base.userID;
        public string setuserID
        {
            set
            {
                this.DataManagerService_Changer.setuserID(userID);
            }
        }    private class DataManagerService_Changer:DataManagerService
        {
            public setuserID(userID)
            {
                base.userID=userID;
            }
        }    //最关键在此
        public ~userIDChanger()
        {
            base.userID=this.father_userID;
        }
    }应该是可以这么用的.
      

  10.   

    lovefootball利用GetInstance的方法,将UserID传进去是个好办法,刚才试过,可以创建两个不同的实例,但是由于项目比较复杂,调试过程中发现,很多其他的类都使用了原来的DataManagerService.Instance这个方法来创建实例,而且我也要调用他们类中的方法。这样又回到了原点,我不能一一更改他们的类吧。所以,创建两个单独实例的方法,应该是不可用了!
      

  11.   


    //声明一个包装类: 
    public   class   userIDChanger 

            private   father_userID=base.userID; 
            public   string   setuserID 
            { 
                    set 
                    { 
                            this.DataManagerService_Changer.setuserID(userID); 
                    } 
            }         private   class   DataManagerService_Changer:DataManagerService 
            { 
                    public   setuserID(userID) 
                    { 
                            base.userID=userID; 
                    } 
            }         //最关键在此 
            public   ~userIDChanger() 
            { 
                    base.userID=this.father_userID; 
            } 

      

  12.   

    jupiter911,对你的方法不是很了解,请讲解怎么调用你的的包装类
    //声明一个包装类: 
    public   class   userIDChanger 

            private   father_userID=base.userID; 
            public   string   setuserID 
            { 
                    set 
                    { 
                            this.DataManagerService_Changer.setuserID(userID); 
                    } 
            }         private   class   DataManagerService_Changer:DataManagerService 
            { 
                    public   setuserID(userID) 
                    { 
                            base.userID=userID; 
                    } 
            }         //最关键在此 
            public   ~userIDChanger() 
            { 
                    base.userID=this.father_userID; 
            } 
      

  13.   

    GetInstance是创建一个实例  第一次的代码才是创建两个实例很简单,你可以去掉第一个GetInstance变成如下

    public   static   DataManagerService   GetInstance() 

            if   (instance   ==   null)   
            { 
                    instance   =   new   DataManagerService(); 
            } 
            return   instance; 

    public static DataManagerService Inctence
    {
        get
        {
            if   (instance   ==   null)   
            { 
                    instance   =   new   DataManagerService(); 
            } 
            return   instance; 
        }
    }public   static   DataManagerService   GetInstance(string   uid) 

        DataManagerService   temp   =   Inctence; 
        Type mytype = typeof(DataManagerService);
        FieldInfo fieldinfo = mytype.GetField("userID", 
           BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);
        if (fieldinfo != null)
        {
            fieldinfo.SetValue(temp, uid);
        } 
        return   temp; 
      

  14.   

    其实就是加了一个方法
    public   static   DataManagerService   GetInstance(string   uid) 
    你的这个问题有两种办法
    第一种就是创建两个实例,首先重载构造函数,构造函数接收UserID参数,然后就是在上面的方法里面重新调用构造函数,新创建一个实例,而不是调用Instance第二种就是上面的代码,在方法里面调用已经创建的Instance,然后用反射赋值
      

  15.   

    哦,错了
    刚才想了想
    你这个还是得弄两个实例
    否则那个类把UserID改掉后
    其他的都跟着改了:)重载个构造函数吧
    然后加个方法
      

  16.   

    哦,我的方法其实很简单.
    在你需要更改userID的时候就实例化一个userIDChanger 对象,然后使用他的只写属性setuserID来对userID赋值,最后在离开这个对象的生命周期之后将调用它的析构函数,此时userID又被赋值回原值.
    当然,在析构函数中也可以硬写它的初始值"TestID"(可以避免多线程引发的问题)
      

  17.   

    谢谢各位,Lovefootball的多个实例的方法 思路很开阔
    jupiter911 的方法比较灵活!谢谢!