C# 哪个类应该负责某些操作?

C# 哪个类应该负责某些操作?,c#,class,C#,Class,我正在制作一个存储系统应用程序。每个存储系统最多包含10个能够存储库存物品的仓库 我想创建一个更新仓库属性(名称、描述等)的方法。有一条业务规则,存储系统中的每个仓库都必须有一个唯一的名称,我不确定应该由哪个类负责。我试图坚持每个班级只对自己负责的原则 下面是一个简单的代码模型(C#) 第二步。在仓库中创建一个方法 public void UpdateWarehouseName(string name) { if(StorageSystem.WarehouseNameAvailable(n

我正在制作一个存储系统应用程序。每个存储系统最多包含10个能够存储库存物品的仓库

我想创建一个更新仓库属性(名称、描述等)的方法。有一条业务规则,存储系统中的每个仓库都必须有一个唯一的名称,我不确定应该由哪个类负责。我试图坚持每个班级只对自己负责的原则

下面是一个简单的代码模型(C#)

第二步。在仓库中创建一个方法

public void UpdateWarehouseName(string name)
{
   if(StorageSystem.WarehouseNameAvailable(name))
    {
        this.name = name;
    }
    else 
    {
        //Throw Exception 
    {
}

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

使T_WAREHOUSE.NAME唯一(假设您的表/列会有这样的名称)-在数据库方面,如果第二个条目使用相同的名称写入,则处理异常

您也可以将该错误/异常提升到用户级别,以向用户显示出错的原因:
请输入其他名称,“超级Dooper仓库”已被采用


您的问题文本表明,这将是一个更大的项目,有许多类彼此交互

如果您没有使用ORM,请考虑使用ORM!通过自定义方法,如
WarehouseNameAvailable
解决方案,它可以实现您想要实现的许多功能


如果您使用的是
实体框架
,则可以通过
[Unique]
属性对类属性执行此操作

使T_WAREHOUSE.NAME唯一(仅假设您的表/列具有类似的名称)-在数据库方面,如果第二个条目使用相同的名称写入,则处理异常

您也可以将该错误/异常提升到用户级别,以向用户显示出错的原因:
请输入其他名称,“超级Dooper仓库”已被采用


您的问题文本表明,这将是一个更大的项目,有许多类彼此交互

如果您没有使用ORM,请考虑使用ORM!通过自定义方法,如
WarehouseNameAvailable
解决方案,它可以实现您想要实现的许多功能

如果您使用的是
实体框架
,则可以通过
[Unique]
属性对类属性执行此操作

这是“正确的”方法吗

这在很大程度上取决于您的总体应用程序体系结构,imho。询问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);
    }
}
公共类重命名操作{
//某种类型的数据库集、数据库连接、外部服务,。。。
//在本例中,我将使用EF-DbSet
专用只读数据库集仓库;
专用只读数据库集存储系统;
public void Execute(int-storageSystemId、int-warehouseId、字符串名){
var storageSystem=\u storageSystems.Single(system=>system.Id==storageSystemId);
if(_storageSystem.Warehouses.Any(wh=>wh.Name==Name))
抛出新的BusinessLogicException(“仓库名称在存储系统中必须是唯一的!”);
var warehouse=storageSystem.Warehouses.Single(wh=>wh.Id==warehouseId);
仓库名称=名称;
//将更新后的仓库写回任何地方,这对DbSet都不起作用。
_仓库。更新(仓库);
}
}
但同样,这正是我所能处理的

这是“正确的”方法吗

这在很大程度上取决于您的总体应用程序体系结构,imho。询问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);
    }
}
公共类重命名操作{
//某种类型的数据库集、数据库连接、外部服务,。。。
//在本例中,我将使用EF-DbSet
专用只读数据库集仓库;
专用只读数据库集存储系统;
public void Execute(int-storageSystemId、int-warehouseId、字符串名){
var storageSystem=\u storageSystems.Single(system=>system.Id==storageSystemId);
if(_storageSystem.Warehouses.Any(wh=>wh.Name==Name))
抛出新的BusinessLogicException(“仓库名称在存储系统中必须是唯一的!”);
var warehouse=storageSystem.Warehouses.Single(wh=>wh.Id==warehouseId);
仓库名称=名称;
//将更新后的仓库写回任何地方,这对DbSet都不起作用。
_仓库。更新(仓库);
}
}

但同样,这正是I所能处理的。

我考虑过使用[Unique]属性,但是,该应用程序能够让用户拥有多个存储系统,因此仓库表可能包含同名仓库,只是在我将使用Entity Framework的不同存储系统中,我当时正在构建模型编辑:拼写在这种情况下,您可以使用
复合键。EF的重写
OnModelCreating
中的语法
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);
    }
}