2011-10-25 10 views
0

私は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を生成することを考慮し、あなたのノートを考慮

+1

コードでオーダーナンバーを生成する必要がありますか?あなたの特定のケースでは、私はDBにこれを処理させ、Orderをリロードします。 – Yahia

+0

他の解決策がない限り、コードでOrderNumberを生成することをお勧めします。 –

答えて

0

[確認のリクエスト]をクリックすると、OrderNumberGeneratorが表示されます。

このような何か:すなわち

public class OrderNumberGenerator : IOrderNumberGenerator 
{ 
    public OrderNumberGenerator(Order order) 
    { 
     //generate new order number for order parameter 
    } 
} 

、生成要求(必要な場合のみ)の瞬間に順、及び種類の逆dipendency Order<->IOrderNumberGenerator

EDIT

ところで、DBレベルでのOrderNumberの生成も考慮してください。あなたのケースでは不可能な場合は、Yahiaのように、最も信頼性の高いソリューションを提案してください。

これが役に立ちます。

+0

OrderNumberGeneratorは、anOrder.OrderNumberに値を割り当てることができません。 OrderNumberプロパティは読み取り専用です。私の更新を確認してください。 –

関連する問題