通过组合理解 CRUD
Undestanding CRUD with Composition
我非常想了解如何组织我的代码。假设我有一个名为 "Brand" 的 class,它有一个 "Product" 对象:
public class Brand {
public int ID { get; set; }
public int name { get; set; }
public Product product { get; set; }
public void add(Brand brand)
{
// Database logic
}
}
而这个 class 称为产品
public class Product {
public int ID { get; set; }
public int name { get; set; }
}
我想知道的是,我应该在产品 class 中使用 AddProduct 方法,还是应该将方法放在顶部 class "Brand"。这是我的困惑。
为了更好地理解这一点,请考虑关注点分离和单一职责。 this post 中的答案是一种很好的表达方式。
现在您有一个名为 Brand
的对象,它包含一个方法 Add
和一些与成为 Brand 对象相关的属性。这意味着品牌不仅负责管理自身,还负责管理自己与数据库的交互。您正在修复 Product
和数据库之间也有类似的耦合。那么当你有一个品牌集合,并且你意识到每个品牌都应该有一个产品集合,并且它们都有数据库逻辑贯穿始终时会发生什么?然后,假设你注意到每个产品都需要一个成分列表,所以你必须添加它,所以成分需要数据库逻辑等等。你会发现这很快就会变得非常混乱。
所以真的,你应该有第三个 class 负责管理数据库对象,并且 class 将有方法调用,将你的品牌和产品对象作为参数并与数据库内部。现在您已经从您的品牌和产品逻辑中抽象出您的数据库逻辑,因此数据库 class 可以执行它为 构建的内容,而不再 ,而品牌和 Class 对象可以作为相关数据的已定义包装器存在 而不是更多 。现在一切都分开了,所以每个 class 代表一个 简单的 概念。 Brand
class 存在代表品牌数据。 Database
class 存在与数据库交互。
我相信您已经理解了这个概念并且您可能已经看过一千遍了,但是像这样思考将帮助您发现需要更改的内容并找到更简单、更清洁、更易于维护的解决方案。
您声明产品的方式是使用 C# Auto 属性。
首先,你应该问问自己,你是否需要product
作为public
成员可见,或者你想封装设置product
的逻辑。
如果答案是希望Product
能够设置在外面,那么就不需要声明任何额外的方法:
public class Brand
{
public int Id { get; set; }
public string Name { get; set; }
public IProduct Product { get; set; }
}
public static void Main(string[] args)
{
var brand = new Brand
{
Id = 1,
Name = "Name",
Product = new Product()
};
}
但是,如果您想封装您设置的方式 product
,请考虑使用组合或聚合方法:
public class Brand
{
private int _id;
public string _name;
private readonly IProduct _product;
public Brand(IProduct product, int id, string name )
{
_product = product;
_id = id;
_name = name;
}
}
public static void Main(string[] args)
{
var brand = new Brand(new Product(), 1, "prd");
}
Note: if you still want to be able to set the product
after object declaration, consider a different name for the method, like SetProduct
or something with close meaning, because AddProduct
means that you are dealing with the collection of Products.
我非常想了解如何组织我的代码。假设我有一个名为 "Brand" 的 class,它有一个 "Product" 对象:
public class Brand {
public int ID { get; set; }
public int name { get; set; }
public Product product { get; set; }
public void add(Brand brand)
{
// Database logic
}
}
而这个 class 称为产品
public class Product {
public int ID { get; set; }
public int name { get; set; }
}
我想知道的是,我应该在产品 class 中使用 AddProduct 方法,还是应该将方法放在顶部 class "Brand"。这是我的困惑。
为了更好地理解这一点,请考虑关注点分离和单一职责。 this post 中的答案是一种很好的表达方式。
现在您有一个名为 Brand
的对象,它包含一个方法 Add
和一些与成为 Brand 对象相关的属性。这意味着品牌不仅负责管理自身,还负责管理自己与数据库的交互。您正在修复 Product
和数据库之间也有类似的耦合。那么当你有一个品牌集合,并且你意识到每个品牌都应该有一个产品集合,并且它们都有数据库逻辑贯穿始终时会发生什么?然后,假设你注意到每个产品都需要一个成分列表,所以你必须添加它,所以成分需要数据库逻辑等等。你会发现这很快就会变得非常混乱。
所以真的,你应该有第三个 class 负责管理数据库对象,并且 class 将有方法调用,将你的品牌和产品对象作为参数并与数据库内部。现在您已经从您的品牌和产品逻辑中抽象出您的数据库逻辑,因此数据库 class 可以执行它为 构建的内容,而不再 ,而品牌和 Class 对象可以作为相关数据的已定义包装器存在 而不是更多 。现在一切都分开了,所以每个 class 代表一个 简单的 概念。 Brand
class 存在代表品牌数据。 Database
class 存在与数据库交互。
我相信您已经理解了这个概念并且您可能已经看过一千遍了,但是像这样思考将帮助您发现需要更改的内容并找到更简单、更清洁、更易于维护的解决方案。
您声明产品的方式是使用 C# Auto 属性。
首先,你应该问问自己,你是否需要product
作为public
成员可见,或者你想封装设置product
的逻辑。
如果答案是希望Product
能够设置在外面,那么就不需要声明任何额外的方法:
public class Brand
{
public int Id { get; set; }
public string Name { get; set; }
public IProduct Product { get; set; }
}
public static void Main(string[] args)
{
var brand = new Brand
{
Id = 1,
Name = "Name",
Product = new Product()
};
}
但是,如果您想封装您设置的方式 product
,请考虑使用组合或聚合方法:
public class Brand
{
private int _id;
public string _name;
private readonly IProduct _product;
public Brand(IProduct product, int id, string name )
{
_product = product;
_id = id;
_name = name;
}
}
public static void Main(string[] args)
{
var brand = new Brand(new Product(), 1, "prd");
}
Note: if you still want to be able to set the
product
after object declaration, consider a different name for the method, likeSetProduct
or something with close meaning, becauseAddProduct
means that you are dealing with the collection of Products.