gpt4 book ai didi

c# - PUT 时记录更改的最佳方法

转载 作者:太空宇宙 更新时间:2023-11-03 10:25:02 24 4
gpt4 key购买 nike

我正在做一个 REST 服务(使用惊人的 ServiceStack ,虽然它与问题无关)我现在需要记录根据 PUT 请求发生的更改。

目前我的更新方法是:

public object Put(PostActivityInformation request)
{
var session = this.SessionAs<MyCustomApiAuthSession>();

var activity = _activitiesRepository.GetActivityById(_companyRepository, session.CurrentCompany.Guid, request.Id);

if (_activitiesRepository.IsActivityDuplicated(session.CurrentCompany.Id, request.SmsCode, request.Name, request.Id))
return HttpError.Conflict("Found a duplicated activity");

// update what is passed
activity.Category = request.Category ?? activity.Category;
activity.Description = request.Description ?? activity.Description;
activity.ExtraTextDescription = request.ExtraTextDescription ?? activity.ExtraTextDescription;
activity.Name = request.Name ?? activity.Name;
activity.Points = request.Points ?? activity.Points;
activity.SaveExtraText = request.SaveExtraText ?? activity.SaveExtraText;
activity.SmsCode = request.SmsCode ?? activity.SmsCode;

activity.IsActive = request.Active ?? activity.IsActive;
activity.IsArchived = request.Archived ?? activity.IsArchived;

// update stamp
activity.UpdatedTime = DateTime.UtcNow;
activity.UpdatedUser = session.CurrentUser.Id;

// save
_activitiesRepository.SaveOrUpdate(activity);

// log
session.AddLog("Activity updated: {0}".Fmt(activity.Name), LogArea.Activities, activity.Id);

return activity.ToActivityResponse();
}

但我想更具描述性并保存更改,比如替换

activity.Category = request.Category ?? activity.Category;
activity.Description = request.Description ?? activity.Description;

通过

var log = new StringBuilder();
if (request.Category != null)
{
log.AppendFormat("Category changed from '{0}' to '{1}'", activity.Category, request.Category);
activity.Category = request.Category;
}
if (request.Description != null)
{
log.AppendFormat("Description changed from '{0}' to '{1}'", activity.Description, request.Description);
activity.Description = request.Description;
}

然后将log 变量保存到我的审计表中...

最好的方法应该是什么,因为我在 API 中确实有几个更新,而不仅仅是“事件”?

我在考虑一个ExtensionMethod,但它会使用Refection 并且会稍微慢一点...

有没有人已经通过了这个问题,你做了什么?

最佳答案

一种方法是在您使用一对辅助方法更改设置时格式化日志:

private static void T? Update(T? newVal, T? oldVal, string name, StringBuilder log) where T : struct {
if (!Equals(newVal, oldVal)) {
log.AppendFormat("{0} changed from '{1}' to '{2}'", name, oldVal, newVal);
}
return newVal ?? oldVal;
}
private static void T Update(T newVal, T oldVal, string name, StringBuilder log) where T : class {
if (!Equals(newVal, oldVal)) {
log.AppendFormat("{0} changed from '{1}' to '{2}'", name, oldVal, newVal);
}
return newVal ?? oldVal;
}

现在你可以统一你的代码如下:

activity.Category = Update(request.Category, activity.Category, nameof(activity.Category), log);
activity.Description = Update(request.Description, activity.Description, nameof(activity.Description), log);
activity.ExtraTextDescription = Update(request.ExtraTextDescription, activity.ExtraTextDescription, nameof(activity.ExtraTextDescription), log);
...

注意:我假设此时您在更改架构方面没有太大的灵 active ,但是保持审计的一个很好的替代方法是让审计成为您的主要信息来源已经改变。当然,这会将审计日志从格式化字符串列表转换为成熟的对象注册表。参见 Event Sourcing Pattern了解更多详情。

关于c# - PUT 时记录更改的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31946110/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com