问题描述如下://有一个单例类,运行在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,最好不要使用函数重载的方法来对函数内部进行传参。因为实例内部的函数非常多,改动非常多。请问大家有什么好的实现办法?
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,最好不要使用函数重载的方法来对函数内部进行传参。因为实例内部的函数非常多,改动非常多。请问大家有什么好的实现办法?
public DataManagerService XXX(sring uid)
{
if (instance1 == null)
instance1 = new DataManagerService(uid);
return instance1;
} private DataManagerService(string uid)
{
this.userID = uid;
}
你可以在方法里面用反射的办法,给userID赋值~~~~~~
{
private static T _instance; public Singleton()
{
} public static T Instance
{
get
{
if (_instance == null)
{ _instance = (T)System.Activator.CreateInstance(typeof(T));
}
return _instance;
}
}
}
应该用静态的实例吧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;
}
public static DataManagerService Instance
{
get
{
if (instance == null)
instance = new DataManagerService();
return instance;
}
}
{
if (instance == null)
{
instance = new DataManagerService();
}
return instance;
}public static DataManagerService GetInstance(string uid)
{
DataManagerService temp = GetInstance();
//利用反射给userid赋值
return temp;
}
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放在上面注释的地方就可以了
public string getuserID()
{
...
}
public string setuserID()
{
...
}
使用时get方法和set方法必须成对出现.
只能用这种方式了.
声明一个包装类:
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;
}
}应该是可以这么用的.
//声明一个包装类:
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;
}
}
//声明一个包装类:
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;
}
}
public static DataManagerService Inctencepublic static DataManagerService GetInstance()
{
if (instance == null)
{
instance = new DataManagerService();
}
return instance;
}
{
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;
}
public static DataManagerService GetInstance(string uid)
你的这个问题有两种办法
第一种就是创建两个实例,首先重载构造函数,构造函数接收UserID参数,然后就是在上面的方法里面重新调用构造函数,新创建一个实例,而不是调用Instance第二种就是上面的代码,在方法里面调用已经创建的Instance,然后用反射赋值
刚才想了想
你这个还是得弄两个实例
否则那个类把UserID改掉后
其他的都跟着改了:)重载个构造函数吧
然后加个方法
在你需要更改userID的时候就实例化一个userIDChanger 对象,然后使用他的只写属性setuserID来对userID赋值,最后在离开这个对象的生命周期之后将调用它的析构函数,此时userID又被赋值回原值.
当然,在析构函数中也可以硬写它的初始值"TestID"(可以避免多线程引发的问题)
jupiter911 的方法比较灵活!谢谢!