我的果园应用程序中有一个购买订单内容类型。除其他属性外,它还有一个PurchaseOrderNumber。当用户第一次保存采购订单时,指定采购订单号。我使用自定义控制器和视图来实现购买订单CRUD操作。
我有一个采购订单号码定义部分,它附加到一个公司内容类型,其中保存下一个采购订单号,一个前缀和填充。因此,当系统生成下一个采购订单号时,前缀(例如PO)与下一个号码(例如123)和填充(例如5)一起用于生成字符串,例如PO00123。
当生成采购订单号码时,存储在附加到公司内容项的采购订单定义部分中的下一个采购订单编号被递增和保存,以便当用户创建另一个采购订单时,将分配下一个号码。
我在这里的挑战是,如果两个用户同时创建一个新的采购订单,则无法分配重复的采购订单号。
我正在考虑创建一个ISingletonDependency,它使用锁(_lock) {.}来包装将生成下一个数字的代码。这样,多个请求就可以请求下一个号码,并且总是得到下一个唯一的号码。不过,我如何实现这一点呢?我不知道如何访问拥有自己数据库事务的IContentManager。
还是有不同的模式,我宁愿使用?
发布于 2017-08-25 03:21:00
我是在看了Orchard.Tasks.Locking.Services.DistributedLockService类之后才弄明白的。您需要接受对ILifetimeScope的依赖,然后解析ITransactionManager和IContentManager。
lock (_lock) {
using (var childLifetimeScope = _lifetimeScope.BeginLifetimeScope()) {
var transactionManager = childLifetimeScope.Resolve<ITransactionManager>();
var contentManager = childLifetimeScope.Resolve<IContentManager>();
try {
transactionManager.RequireNew(IsolationLevel.Serializable);
var contentItem = contentManager.GetLatest(contentItemId);
var number = CompileNewNumber(contentItem);
contentManager.Publish(contentItem);
return number;
}
catch (Exception exception) {
Logger.Error(exception, "Error compiling next number.");
transactionManager.Cancel();
return "";
}
}
}https://stackoverflow.com/questions/45864391
复制相似问题