2011-01-31 11 views
2

私は別のサブスクリプションタイプをサポートするためのサイト、無料、プレミアムおよびなどこれらの制限(ビジネス制限)を適用するにはどうすればよいですか?

は、これまでのところ私は、だから今、私はすべての私のアカウントの種類のためにこれをやった

public abstract class Limits 
    { 

     public int PostLimit { get; protected set; } 


     protected Limits(int postLimit) 
     { 
      PostLimit = postLimit; 
     } 

     public bool IsLimitReached(int postCount) 
     { 
      return postCount > PostLimit 
     } 

    } 


public class FreeLimit : Limits 
    { 
     private const int postLimit = 1; 


     public FreeLimit() 
      : base(postLimit) 
     { 
     } 

    } 

このようなものです抽象クラスを作っしたいです。今問題は、このクラスを実際にどのように使用するのか分かりません。

は、例えば、私はサービス層コールPostServiceを持っており、このクラスでは、私は、彼らが限界に達しているかどうかを確認する方法がわからない、この方法では今

public void CreatePost(Post post) 
{ 
    // do stuff here 
} 

を持っています。 FreeLimitまたはPremiumLimitを使用するべきかどうか、またどのようなアカウントを持っているべきかを確認する方法がわからないため、チェックする方法がわかりません。

私は最初に自分の役割を把握し、その情報を使って適切なクラスを作成しなければならないと考えています。

私は私が今のように制限を確認する必要があるすべての方法がこれを行う必要がありますため、この方法は好きではない

public void CreatePost(Post post, PlanType planType) 
{ 
    Limits limit; 
    switch(planType) 
    { 
     case planType.Free: 
     limit = new FreeLmit() 
     break; 
    } 

    if(limit.IsLimitReached()) 
    { 
     // do stuff 
    } 
} 

のようなものを持っていることができると思います。私は私のサービス層でこのチェックが必要ないくつかの方法を持っています。

私はそれを私のコンストラクタに入れることを考えていましたが、コンストラクタでswitch文を持つのが良いのかどうか分かりません。

+0

あなたは、ポスト投稿、PlanType planTypeをチェックする必要があるCreatePost以外のメソッドがあることを意味しますか? –

+0

@Caspar Kleijne - これは私が作った一例です(私は実際にはポストリミットを持っていません)。 PlanTypeは現在の計画を保持する列挙型にすぎません。 – chobo2

+0

制限を抽象クラスとして使用し、それを継承することに同意しません。あなたのサブクラスが数値によって異なる場合、それらをサブクラス化するのはなぜですか? – Amy

答えて

0

あなたは今、あなたはこのインタフェースを実装するいくつかの他のクラス(無料、プレミアム、スーパー)を持つことができますILimit

interface ILimit 
{ 
    int PostLimit { get; protected set; } 
    bool IsLimitReached(int postCount); 
} 

インタフェースを使用することができます。あなたのサービスメソッドCreatePostでは、インターフェイスを実装しているクラスのインスタンスを渡すことができます。それらはすべて同じインターフェイスをサポートしているため、もう区別する必要はありません。

public void CreatePost(Post post, ILimit limit) 
{ 
    if(limit.IsLimitReached()) 
    { 
     // do stuff 
    } 
} 
+0

私はこれについて考えていましたが、これについて気に入らないのは、毎回自分自身を繰り返す必要があるということです。つまり、IsLimitReachedはif文と同じメソッドです。しかし、今私はこの同じ方法を3回書いています。 – chobo2

0

まあ、Limitプロパティはどのようなエンティティに関連付けられていますか?私はそれがブログ(または多分フォーラム)に結びついていると思うし、それはDBなどに保存されています。

もしそうなら、あなたはこのような何かを行うことができます。

public void CreatePost(Post post) 
{ 
    if(post.Blog.IsLimitReached()) 
    { 
     // do stuff 
    } 
} 

Blog.IsPostLimitReached()自体からthis.Limit.IsLimitReachedを呼び出す必要があります。

私はあなたが私はあなたがユーザーのさまざまな種類を持っている場合は(彼らはログインしたら)

0

は、あなたが別のRoleTypesに自分のアカウントを結びつけることができます:)言ったことを理解することができます願っています。次に、HttpContext.Current.User.IsInRole("RoleName")を使用して特定の役割に含まれているかどうかを確認し、その機能を表示/非表示するための基礎として使用できます。

+0

これを行うには、RoleProviderに基づくクラスを実装する必要があるかもしれないので、ユーザーアカウント(.NETの組み込みメンバーシップのものを使用)を異なるロールに結びつけることができます。これは明らかに、ユーザーのログインが必要な場合にのみ有効です。 – Jeff