哪一类负责某些动作?

时间:2018-09-25 10:31:38

标签: c# class

我正在制作一个存储系统应用程序。每个存储系统最多包含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 
    {
}

这是“正确正确”的方法吗?

2 个答案:

答案 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);
    }
}

但是,这又是处理的方式。