0

特定の顧客とその顧客の注文の詳細を選択できるトランザクション フォームがあるとします。

だから私は持っているでしょう:

Customer.cs

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

Goods.cs

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

Order.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 からの) 入力があるか、ストレージ (リポジトリ) から取得する必要があります。そうすれば、Order クラスで作成するのではなく、注入される Detail を保持することを好みます。UIまたはリポジトリ、またはそれを担当するビジネスクラスで作成されます。

注文フォームを保存したい場合、注文の詳細を入力するプレゼンテーション レイヤーまたはビジネス レイヤーを使用する必要がありますか?

注文明細オブジェクトの作成に特定のルールがあるかどうかによります。そうでない場合は、詳細を含む Order クラスを作成し、ビジネス層に検証を任せます。特定のロジックが必要な場合 (プロパティ B に値 1 が設定されている場合に値 A をプロパティ A に設定するなど)、それをビジネス ロジックに保持するか、そのためのビルダー パターンを作成します。

ビジネス層が保存するリポジトリの完全なオブジェクトのみを送信する場合、ビジネス層は新しい注文オブジェクトを作成できるはずですか? または、DI を念頭に置いて一時的なオブジェクトの作成を管理する別の方法はありますか?

上記の私の回答と同じです。依存性注入の主なポイントは、ロジックをモジュール化して再利用および標準化できるようにすることです。オブジェクトの作成 (詳細) で特定の再利用可能なロジックが必要であると思われる場合は、そのための Service オブジェクトを作成する必要があります。それ以外の場合は、作成を他のレイヤー (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);
}

最も安全 (IMHO):

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 に答える