通过组合理解 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.