这是我在创建需要在整个应用程序范围内可用的对象(例如集合)时遇到的一个特定问题。
我有以下课程:
class UserDataCollection
{
List<UserData> Collection = new List<UserData>();
UserData current;
public UserData Current
{
get { return current; }
set
{
current = value;
}
}
public UserDataCollection( UserData userdata )
{
this.current = userdata;
}
public void Add ( UserData item )
{
Collection.Add(item);
}
}
现在,对于我想要添加的每个UserData对象,每次我去UserDataCollection datacoll = new UserDataCollection(userdata);
所以我的对象永远不会被添加到同一个集合中,这不是这个集合的重点。
这是一个很好的单例案例还是仅仅在Application Init中创建对象并在整个过程中使用相同的对象?
对于这样的事情,最好的设计实践是什么?
答案 0 :(得分:1)
您可以将列表设为静态。然后只会有一个集合。
答案 1 :(得分:1)
取决于
如果它是一个Web应用程序,您可以在应用程序启动时创建您的集合并将其存储到HttpContext的Application属性中。如果没有,您可以使用单例或IoC容器并将其配置为始终返回对象的同一实例。
P.S:如果应用程序的多个线程同时运行,请确保在更新集合之前使用锁。
希望它会有所帮助。
答案 2 :(得分:0)
这样的集合显然是针对多个对象的,所以你可以在创建...对象集合的地方实例化它们......如果你想使用ctor,那么它应该采用它的参数a ...这些对象的集合或可枚举集......
// Inheriting from List<UserData> eliminates need for most of your code
class UserDataCollection: List<UserData>
{
public UserDataCollection(IEnumerable<UserData> users)
{
foreach (UserData usr in users)
Add(usr);
}
}
答案 3 :(得分:0)
如果每个应用程序只有一个UserDataCollection,那么我不明白为什么不将它作为单例。
答案 4 :(得分:0)
我喜欢这里的Singleton的想法,如果你只想要一个整个应用程序。如果你在ASP.NET应用程序中使用它,你将需要注意单例,因为static
变量就像在应用程序状态中保存数据...这可能是你想要的......但不容易注意到对外界(可维护性问题)。