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