私はC#を使用して注文システムを構築しており、注文番号の生成に問題があります。デザイン決定:データベース値に依存するOrderNumberを生成
私はOrderNumberプロパティを持つOrderクラスを持っています。 OrderNumberプロパティを読み取り専用にしたいのは、OrderNumberの変更が安全でないためです。
注文手順は非常に複雑です(4ステップ、いくつかのステップが完了するまでに10分かかる場合があります)ので、各ステップで注文を保存する必要があります。しかし、顧客はOrderNumberを浪費したくない(OrderNumberは "Year-Month-An_DB_Value"形式になっています)、OrderNumberの最後の部分はその月の注文数を示します。したがって、OrderNumberは、ユーザーが[Request Verification]ボタンをクリックしたときにのみ割り当てる必要があります。
注文番号を生成し、(データベースへの依存関係を持っていないし、ユニットテストすることができます)クリーンOrderクラスを維持するために、私はこのように、Orderクラスのコンストラクタの引数としてIOrderNumberGeneratorインターフェースを作りたい:
public class Order {
public string OrderNumber { get; private set; }
public Order(IOrderNumberGenerator generator) {
// ...
}
}
しかし、問題があります。
OrderNumberを割り当てずに注文を保存することができます。だから何日か後に、ユーザーがOrder VerifierにOrderを渡したい場合、彼は "Request Verification"ボタンをクリックし、システムはO/R Mapper(私はNHibernateを使用)経由でデータベースからOrderオブジェクトを取得します。そのここでは、OrderオブジェクトがO/R Mapperから取得するため、ORrはOrderクラスのデフォルトのコンストラクタを呼び出すことでOrderオブジェクトを再構成するため、IOrderNumberGeneratorを渡す方法はありません(IOrderNumberGeneratorを渡す方法はありません) )。ここでは、デモ・コードは次のとおりです。
Order order = repository.GetOrder(orderId);
// code to generate the order number
xxx.SubmitChanges();
だから私の質問はまだユニットテストを行うには、清潔で簡単Orderクラスを維持しながら、注文番号の生成問題を解決する方法、です。
更新: 私は今、注文クラスに)GenerateOrderNumber(という名前のメソッドを作成し、IOrderNumberGeneratorを通過し、このように思っている:
public class Order {
public void GenerateOrderNumber(IOrderNumberGenerator generator) {
_orderNumber = generate.Generate();
}
}
私はそれが問題を解決することができると思いますが、より良い解決策はありますか?
ところで:これが私の最後の質問から拡張された質問です:Design Decision: OrderNumber property in Order class - Public or Private?
ありがとう! 私は上の順序を生成言う要求の検証「ボタン 『
を』注文番号は、ユーザーがクリックしたときにのみ割り当てる必要がありますので、」:あなたがコードからOrderNumber
を生成することを考慮し、あなたのノートを考慮
コードでオーダーナンバーを生成する必要がありますか?あなたの特定のケースでは、私はDBにこれを処理させ、Orderをリロードします。 – Yahia
他の解決策がない限り、コードでOrderNumberを生成することをお勧めします。 –