0

假设我有一个交易表格,我可以在其中选择特定客户和该客户的订单详细信息。

所以我会有:

客户.cs

public class Customer
{
    public string Id { get; set}
    public string Name { get; set}
}

商品.cs

public class Goods
{
    public string Id { get; set}
    public string Description { get; set}
    public string Price { get; set}
}

订单.cs

public class Order
{
    private List<Goods> _orderedGoods = new List<Goods>();

    public string Id { get; set}
    public Customer Customer { get; set}
    public List<Goods> OrderedGoods { get; }

    public void AddGoods(Goods goods)
    {
        _orderedGoods.Add(goods);
    }
}

然后在表示层,我有一个仅包含商品 ID 字符串的网格视图。

我的问题是:

  1. 如果我让 Order 类创建它自己的细节可以吗?还是也应该注入财产?

  2. 当我想保存我的订单时,应该填写订单详细信息的展示层还是业务层?

  3. 如果业务层只发送一个完整的对象供存储库保存,那么业务层应该能够创建一个新的订单对象吗?或者是否有另一种方法可以在考虑 DI 的情况下管理瞬态对象创建?

对不起,这个问题很长,真的需要帮助。

谢谢 !

4

1 回答 1

1

这是相当主观的,但对我来说:

如果我让 Order 类创建它自己的细节可以吗?还是也应该注入财产?

创建自己的细节是什么意思?一个新的细节对象应该有一个输入(来自 UI)或者应该从一个存储(存储库)中检索。这样,我更喜欢保留要注入的 Detail 而不是在 Order 类中创建;并在 UI 或存储库或负责它的业务类中创建。

当我想保存我的订单时,应该填写订单详细信息的展示层还是业务层?

这取决于订单明细对象的创建是否有特定的规则。如果没有,那么我更喜欢使用详细信息创建 Order 类,并让业务层进行验证。如果它需要特定的逻辑(例如您将值 A 设置为属性 A,如果值 1 设置为属性 B),请将其保留在业务逻辑中,或为其创建构建器模式。

如果业务层只发送一个完整的对象供存储库保存,那么业务层应该能够创建一个新的订单对象吗?或者是否有另一种方法可以在考虑 DI 的情况下管理瞬态对象创建?

和我上面的回答一样。依赖注入的主要目的是保持逻辑以这种模块化的方式,因此可以重用和标准化。如果您认为在对象创建(详细信息)中需要特定的可重用逻辑,那么您需要为其创建一个服务对象。否则,最好将创建留在其他层(UI)中。

其他需要注意的事项:

您确定要List<T>用作 Detail 数据类型吗?它将详细对象的实现限制为仅List<T>. 如果有时要使用该逻辑Array,则需要对该对象进行其他配置。如果我需要在运行插入时进行,我更喜欢使用IEnumerable<T>并私下使用。List<T>

编辑:

似乎用户想知道如何处理对象创建。我会从最简单到最安全的解释。

最简单 --> UI 级别,假设使用 C# winform:

public void ButtonAddGoods_Click(){
    Goods newGood = new Goods();
    newGood.Id = txtProductId.Text;
    newGood.Description = txtProductDescription.Text;
    newGood.Price = txtProductPrice.Text;

    this.Order.AddNewGood(newGood);
}

最安全的(恕我直言):

public class GoodBuilder{
    public Goods CreateGood(){
        if(string.IsEmpty(this.Id)) Throw new NullReferenceException("Goods Id is not set");
        //additional validation
        Goods newGood = new Goods();
        newGood.Id = txtProductId.Text;
        newGood.Description = txtProductDescription.Text;
        newGood.Price = txtProductPrice.Text;

        return newGood;
    }
}

public void ButtonAddGoods_Click(){
    GoodBuilder builder = new GoodBuilder();
    builder.Id = this.Id;
    builder.Description = this.Description;
    builder.Price = this.Price;

    this.Order.AddNewGood(builder.CreateGood());
}
于 2013-05-04T05:21:13.400 回答