对于我们各个部分,我们都有一种复杂的用户偏好结构 网站。由于这个事实,我将它们作为json字符串存储在单个列中。它也可以是一个文件。
我有各种更新方法,负责更新设置的特定部分。
我有两个问题:
我将它们保留为json的方法是否正确?我不能(或可能不想)弄平设置,因为设置太多了,它们可能会增加时间。
我应该如何处理两个请求同时出现的情况,这些请求会更新设置的相同部分。
仅举一个例子,这些设置之一提供了图像图块的源提供者。有几块瓷砖,所以我有这样的东西:
public class UserSettings
{
public List<string> Providers {get;set;} = new List<string>();
}
在客户端,每个磁贴将从该列表中获取提供者,或默认为'provider1'。
在某个时候,我需要将指向“ provider2”的图块重置为现在再次指向“ provider1”的图块。
每个图块都负责将其状态推送到服务器,因此它们具有如下方法(其中index是图块的索引):
let updateImageTileSettings = function (provider) {
let index = this.index;
let images = [];
images[index] = provider;
return $.ajax({
url: userApi + '/UpdateImageTileSettings',
type: 'PUT',
data: { tiles: images }
});
}
在服务器上,我有一个带有如下端点的ApiController:
[HttpPut]
public async Task<UserModel> UpdateImageTileSettings(JObject input)
{
var tiles = input["tiles"].ToObject<List<string>>();
int userId = User.Identity.GetUserId<int>();
var user = await _applicationUserApi.FindEntityAsync(userId);
var settings = user.Settings ?? new UserSettings();
for(var i=0;i<=tiles.Count() - 1; i++)
{
if (settings.Providers .Count() < i + 1)
{
settings.Providers .Add(tiles[i]);
}
else
{
if (!String.IsNullOrWhiteSpace(tiles[i]))
{
settings.Providers [i] = tiles[i];
}
}
}
BackgroundJob.Enqueue<IApplicationUserApi>(x => x.UpdateUserPreferences(userId, settings));
return GetModel(user);
}
因此,发生的事情是每次希望更新磁贴提供程序时,它将从数据库获取设置,更新此单个磁贴并推送到数据库。问题是在这种情况下,我想同时更新多个图块(多个请求一起出现),那么它们将从数据库中获取当前设置,而现在它们都具有相同的当前设置。它们中的每个仅更新自身,保留其余值,并推送到数据库。因此,发生的情况是最后一个服务将放弃所有先前的更改,而仅保留它所服务的更改。
任何想法都将不胜感激。