====== 微软数据访问教程中有关业务逻辑执行的问题 ======
原文(实际是翻译后转载的)链接
https://www.jb51.net/article/83252.htm
文章比较长,业务规则是:
如果一个供应商仅仅供应一个产品的话,那么修改产品的信息的时候,是不能将这个产品的状态设置为停用.
不用太纠结是哪种语言,也不用太纠结细节。。。
代码如下:
这里的问题是当执行 if (productsBySupplier.Count == 1) 时,此供应商供应了 2 个产品。继续执行 product.ProductName = productName; 时,
在另一个CPU核心上,或是单核发生线程切换时,另一个用户删除了该供应商的一个产品的代码被完整的执行了。此时该供应商供应的产品数量为 1,
那么接下来的逻辑将继续执行,但是这个供应商仅仅供应 1个产品了,却执行了 停用 ,也就违反了业务规则 。
第一个问题,是不是将业务逻辑放到存储过程里来解决而不是应用层来解决更好
第二个问题,如果根本上解决这个问题?
多谢。
https://www.jb51.net/article/83252.htm
文章比较长,业务规则是:
如果一个供应商仅仅供应一个产品的话,那么修改产品的信息的时候,是不能将这个产品的状态设置为停用.
不用太纠结是哪种语言,也不用太纠结细节。。。
代码如下:
public bool UpdateProduct(string productName, int? supplierID, int? categoryID, string quantityPerUnit,
decimal? unitPrice, short? unitsInStock, short? unitsOnOrder, short? reorderLevel,
bool discontinued, int productID)
{
Northwind.ProductsDataTable products = Adapter.GetProductByProductID(productID);
if (products.Count == 0)
// 根据productID查找时,没有找到匹配项,返回false
return false;
// product 即表示 Product 表中的一条记录
Northwind.ProductsRow product = products[0];
// 业务规则检查 – 不能停用某供应商所提供的唯一一个产品
if (discontinued)
{
// 获取我们从这个供应商处获得的所有产品
Northwind.ProductsDataTable productsBySupplier = Adapter.GetProductsBySupplierID(product.SupplierID);
if (productsBySupplier.Count == 1)
// 这是我们从这个供应商处获得的唯一一个产品,如果仅仅供应 1 个产品,则抛出异常
throw new ApplicationException("You cannot mark a product as discontinued if its the only product purchased from a supplier");
}
product.ProductName = productName;
if (supplierID == null) product.SetSupplierIDNull(); else product.SupplierID = supplierID.Value;
if (categoryID == null) product.SetCategoryIDNull(); else product.CategoryID = categoryID.Value;
if (quantityPerUnit == null) product.SetQuantityPerUnitNull(); else product.QuantityPerUnit = quantityPerUnit;
if (unitPrice == null) product.SetUnitPriceNull(); else product.UnitPrice = unitPrice.Value;
if (unitsInStock == null) product.SetUnitsInStockNull(); else product.UnitsInStock = unitsInStock.Value;
if (unitsOnOrder == null) product.SetUnitsOnOrderNull(); else product.UnitsOnOrder = unitsOnOrder.Value;
if (reorderLevel == null) product.SetReorderLevelNull(); else product.ReorderLevel = reorderLevel.Value;
product.Discontinued = discontinued;
// 更新产品记录
int rowsAffected = Adapter.Update(product);
// 如果刚好更新了一条记录,则返回true,否则返回false
return rowsAffected == 1;
}
这里的问题是当执行 if (productsBySupplier.Count == 1) 时,此供应商供应了 2 个产品。继续执行 product.ProductName = productName; 时,
在另一个CPU核心上,或是单核发生线程切换时,另一个用户删除了该供应商的一个产品的代码被完整的执行了。此时该供应商供应的产品数量为 1,
那么接下来的逻辑将继续执行,但是这个供应商仅仅供应 1个产品了,却执行了 停用 ,也就违反了业务规则 。
第一个问题,是不是将业务逻辑放到存储过程里来解决而不是应用层来解决更好
第二个问题,如果根本上解决这个问题?
多谢。
...全文
相关推荐
什么是三层架构_表现层/业务逻辑层/数据访问层
表现层不应包含任何业务逻辑或直接的数据访问。2. 业务逻辑层应独立于UI和数据存储,只提供API接口供其他层调用。3. 数据访问层应抽象化,使其可以轻松替换不同的数据存储技术。4.
微软企业库5.0应用教程及实践
微软企业库(Microsoft Enterprise Library)是一个开源的软件框架,由一系列的应用程序块组成,旨在简化企业级应用的开发和维护。企业库提供了一组可重用的类和接口,覆盖了日志记录、缓存、异常处理、数据访问等常见问题的解决方案。通过这种方式,开发团队可以减少重复代码的编写,专注于核心业务逻辑的实现。配置管理应用块(Configuration Management Application Block)是微软企业库的一个组成部分,旨在为软件系统提供一个统一的配置管理机制。
微软的机器人仿真软件microsoft robotics studio教程
**社区支持**:微软机器人工作室拥有活跃的开发者社区,用户可以在这里分享经验、解决问题,促进了技术的交流和进步。
微软账号怎么注册 Microsoft帐户注册使用教程.docx
"微软账号怎么注册Microsoft帐户注册使用教程"微软账号是微软公司提供的一个统一身份验证服务,允许用户访问各种微软服务,如Windows 10操作系统、Office 365、OneDrive
Microsoft Speech SDK安装包及博客教程教程(语音识别)
本教程将引导你了解如何安装SDK并利用其进行语音识别应用的开发。首先,安装Microsoft Speech SDK是一个必要的步骤。


