C# MVC.NET网站上的XML对象ID生成问题与静态类有关
情况: 我们目前有一个MVC网站,可以从xml模式到对象模型进行序列化和反序列化。其中一些对象的ID属性是xml中的一个属性 要求: 我们需要确保xml中的每个ID都是唯一的。对象以服务器端代码添加到我们的模式模型中,然后使用XMLSerializer进行序列化。这些对象ID必须在序列化之前设置,因为我们在构建序列化对象时在其他时间使用它们。因此,理想情况下需要在对象创建时设置它们 此对象模型也由与网站无关的代码使用,因为它由另一个DLL项目使用。因此,在对象中使用会话状态之类的东西来跟踪ID等并不是一个真正的选项 限制: xmlserialiser似乎要求要序列化和反序列化的对象提供无参数构造函数。因此,我们不能强制我们的对象接受任何类型的IDGenerator。我想我们可以有两个构造函数,但程序员必须记住调用write构造函数 分辨率: 我们创建了一个静态类,用于对象模型的构造函数中。这将确保ID始终递增。这还意味着,当在代码中创建新对象时,我们不必像在构造函数创建时那样担心正在创建的ID 代码: 我们的问题: 问题似乎在于我们使用静态变量来包含用于创建ID的_value属性。因为这是在我们的网站上运行的,所以变量在所有用户之间共享,所以每次用户做某事时都会进行设置/重置调整。这会影响其他用户,即使他们的最大ID等完全不同 所需解决方案: 我们希望确保生成唯一的ID,但生成的ID仅基于当前用户的XML设置。因此,我们可能不想使用静力学。但是,我们不希望在继承自ObjectModel的每个对象上都明确地设置它,因为这意味着我们必须记住在每次创建新对象时设置ID 有人有什么想法能帮上忙吗?这有点难以解释,所以如果没有意义,让我知道,我会相应地更新 更新: 在莫滕斯,我现在使用联锁来增加变量计数器 更新:C# MVC.NET网站上的XML对象ID生成问题与静态类有关,c#,xml,xml-serialization,C#,Xml,Xml Serialization,情况: 我们目前有一个MVC网站,可以从xml模式到对象模型进行序列化和反序列化。其中一些对象的ID属性是xml中的一个属性 要求: 我们需要确保xml中的每个ID都是唯一的。对象以服务器端代码添加到我们的模式模型中,然后使用XMLSerializer进行序列化。这些对象ID必须在序列化之前设置,因为我们在构建序列化对象时在其他时间使用它们。因此,理想情况下需要在对象创建时设置它们 此对象模型也由与网站无关的代码使用,因为它由另一个DLL项目使用。因此,在对象中使用会话状态之类的东西来跟踪ID等
我还可能指出,xml可能是在我们的环境之外生成的,因此我们最初无法控制针对ObjectModel模式元素存储的ID int值。似乎过于复杂。为什么要重置最大值?为什么不同的客户端不能获得相同的id?简言之,你需要id或序列号吗?@HenkHolterman客户端是否获得相同的id并不重要,但是在某个时候id生成器将命中整数.Max值,因此我们需要以某种方式确保它是唯一的。通过让它只为用户使用,我想理论是它永远不会达到这个目标。还有,身份证,序列号,我想这并不重要。我们只需要整数在当前xml文档中是唯一的。只需使用一个简单的递增计数器。如果你点击MaxInt,你需要一个
长的。这就解决了单服务器的问题。还要注意,“\u value++”不是线程安全的。使用Interlocked.Increment更新静态计数器变量。
internal static class IdGenerator
{
private static int Min = 0x8000; //0xA0000;
private static int Max = 0xFFFF9;
private static int _value = Min - 1;
private static int _objectIterations = 0;
public static int NextId()
{
if (_value < Max)
{
Interlocked.Increment(ref _value);
}
else
{
_value = Min;
}
return _value;
}
/// <summary>
/// Navigates the schema tree and returns the maxium value from properties identified with the SchemaObjectIdentity attribute
/// </summary>
/// <param name="scenario"></param>
/// <returns></returns>
public static void SetMinimumIdentity(ObjectModel analysis, int minimum)
{
int currentMax = minimum;
PropertyMax<ObjectModel>(analysis, ref currentMax);
if (_value < currentMax)
_value = currentMax + 1;
}
}
public partial class ObjectModel
{
public OverseerObjectIDType()
{
ID = IdGenerator.NextId();
}
}