2009-03-12 13 views
1

における記述のうち、私はそうのような顧客の階層を持っている場合は避け子オブジェクトの型情報を取得します。私は顧客を取得する場合デザインの問題:プレゼンテーション層

abstract class Customer { 
    public virtual string Name { get; set; } 
} 

class HighValueCustomer : Customer { 
    public virtual int MaxSpending { get; set; } 
} 

class SpecialCustomer : Customer { 
    public virtual string Award { get; set; } 
} 

、私は、Web上で表示したいと思いにプロパティを構成します編集/変更。現在、if文を使用して子の顧客タイプを特定し、特殊なプロパティを表示します。私はプレゼンテーション層で "if"ステートメントを避けることができるようにデザインパターン(訪問者?)またはより良い方法はありますか?どうやってやるの?

詳細情報:これは、nHibernateバックエンドを使用するasp.net Webサイトです。各顧客タイプには、顧客タイプを指定して自動的にロードするページ上に独自のユーザーコントロールがあります。

答えて

2

リフレクションを使用して、サブクラス(インスタンス)固有のプロパティのリストを取得できますか? (エラーが起こりにくい)

そうでなければ、特別なプロパティを返す(仮想)メソッドを作成します。 (その他のエラーが発生しやすい!)

後者の例:

abstract class Customer { 
    public virtual string Name { get; set; } 

    public virtual IDictionary<string, object> GetProperties() 
    { 
     var ret = new Dictionary<string, object>(); 
     ret["Name"] = Name; 
     return ret; 
    } 
} 

class HighValueCustomer : Customer { 
    public virtual int MaxSpending { get; set; } 

    public override IDictionary<string, object> GetProperties() 
    { 
     var ret = base.GetProperties(); 
     ret["Max spending"] = MaxSpending; 
     return ret; 
    } 
} 

class SpecialCustomer : Customer { 
    public virtual string Award { get; set; } 

    public override IDictionary<string, object> GetProperties() 
    { 
     var ret = base.GetProperties(); 
     ret["Award"] = Award; 
     return ret; 
    } 
} 

、あなたはおそらくとにかく、セクション(fieldsetの?)あなたのWebページ上に作成したいので、ifが遊びに来ますこの余分なコーディングをちょっと迷惑で無用にしています。

public class FinancialCustomer : Customer<FinancialCustomer> 
{ 
} 

これは私の頭の上からですので、動作しない可能性があります:のサブクラスで

public class Customer<T> 
    where T : Customer<T> 
{ 
    private T subClass; 
    public IDictionary<string, object> GetProperties() 
    { 
     return subClass.GetProperties(); 
    } 
} 

+0

。これらのプロパティを設定するには、どのように仮想メソッドを使用しますか? – Mank

+0

@Mank、Reflectionは簡単な答えです。 ; P などを使ってそれらを設定できると思います。わからない。多分、カプセル化オブジェクトを持っていますか?私はそこにあなたを助けるのに十分なC#を知らない。 – strager

0

は、あなたがこのような何かを試してみました。私はCSLA.NETでこの種のコードを見てきました。 BusinessBase.csと呼ばれるCSLA.NETクラスへのリンクは、上記のものと同様の定義を持っています。

+0

私は物事を見ているのですか、これは(強制的な)無限の再帰ですか?顧客<顧客<顧客<顧客<...> >>>代わりに、「T:顧客」を意味するのでしょうか? – strager

+0

いいえ私はそれがうまくいくと思います。たとえば、CSLA.NETは次のものを持っています。public abstract class BusinessBase : Core.BusinessBase、Core.ISavable T:BusinessBase ここを参照してください:http://www.lhotka。 –

+0

たとえば、public class FinancialCustomer:Customer {}がコンパイルする必要があります。 –

2

私は、より洗練された組織は、ディスプレイコントロールやフォーマットの並列階層を持つことになると思います。抽象ファクトリパターンのようなものを使用して、CustomerとCustomerFormのインスタンスを同時に作成することもできます。余分なプロパティとそれらを表示および編集する方法について知っている返されるCustomerFormインスタンスを表示します。新しい

0

interface CustomerEdit 
{ 
    void Display(); 
} 

編集:

abstract class Customer { 
    protected CustomerEdit customerEdit; // customers have an object which allows for edit 

    public virtual string Name { get; set; } 
    public void Display() { customerEdit.Display(); } // allow the CustomerEdit implementor to display the UI elements 
} 

// Set customerEdit in constructor, tie with "this" 
class HighValueCustomer : Customer { 
    public virtual int MaxSpending { get; set; } 
} 

// Set customerEdit in constructor, tie with "this" 
class SpecialCustomer : Customer { 
    public virtual string Award { get; set; } 
} 

使用:私は反射を避けるためにしようとしています

Customer whichCouldItBe = GetSomeCustomer(); 
whichCouldItBe.Display(); // shows UI depeneding on the concrete type 
関連する問題