我正在制作一个存储系统应用程序。每个存储系统最多包含10个能够存储库存项目的仓库。
我想创建一种更新仓库属性(名称,说明等)的方法。根据业务规则,存储系统中的每个仓库都必须具有唯一的名称,并且不确定应由哪个类负责。我试图坚持每个班级只对自己负责的原则。
这是代码(C#)的简单模型
public class StorageSystem
{
public List<Warehouse> Warehouses{Get;}
}
public class Warehouse
{
public string Name{Get; private Set;}
public int StorageSystemId{Get; Set;}
public StorageSystem Sotrage System{Get; Set;}
}
我认为我应该做以下事情,
步骤1。在StorageSystem类中创建一个方法。
public bool WarehouseNameAvailable(string name)
{
//Check List of Warehouses for the name
//if found return false
//else return true
}
步骤2。在仓库中创建方法
public void UpdateWarehouseName(string name)
{
if(StorageSystem.WarehouseNameAvailable(name))
{
this.name = name;
}
else
{
//Throw Exception
{
}
这是“正确正确”的方法吗?
答案 0 :(得分:1)
使T_WAREHOUSE.NAME唯一(假设您的表/列具有这样的名称)-明智的数据库操作,如果第二个条目以相同的名称写入,则处理该异常。
您也可以将该错误/异常提升到用户级别,以向用户显示出问题所在:enter a different name please, "Super Dooper Warehouse" is already taken
您的问题文本表明,这将是一个更大的项目,其中许多类相互交互。
如果您不使用ORM,请考虑使用一个!您尝试通过自定义方法实现的目标很多,这使您的WarehouseNameAvailable
解决方法变了。
如果您使用的是Entity Framework
,则可以通过[Unique]
属性在类属性中执行此操作。
答案 1 :(得分:1)
这是“正确正确”的方法吗?
这在很大程度上取决于您的整体应用程序体系结构,恕我直言。询问5个开发人员您的解决方案是否“正确且正确”,您将获得6条意见。
要讲清楚:当仅涉及DDD概念时,您的解决方案似乎至少是可行的。但老实说,我从未遇到过规模如此大的企业应用程序,该应用程序能够以结构化(!)和可维护(!)的方式完全在域模型中投影其业务逻辑,并且不需要某种服务在它上面。我个人喜欢这种方法,建议将这些要求放在代表业务/用例的单独类中:
public class RenameAction {
//Some Kind of DbSet, Database Connection, external service,...
//I'll go with an EF - DbSet<Warehouse> in this example
private readonly DbSet<Warehouse>_warehouses;
private readonly DbSet<StorageSystem> _storageSystem;
public void Execute(int storageSystemId, int warehouseId, string name) {
var storageSystem = _storageSystems.Single(system => system.Id == storageSystemId);
if (_storageSystem.Warehouses.Any(wh => wh.Name == name))
throw new BusinessLogicException("Warehouse names must be unique within storage systems!");
var warehouse = storageSystem.Warehouses.Single(wh => wh.Id == warehouseId);
warehouse.Name = name;
//Write back the updated warehouse to whereever, this won't work with an DbSet<Warehouse>.
_warehouses.Update(warehouse);
}
}
但是,这又是我处理的方式。