Ich möchte, dass meine Website verschiedene Abonnementtypen unterstützt, z. B. kostenlos, Premium und so weiter.
Bislang habe ich eine abstrakte Klasse erstellt, die wie folgt aussieht
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)
{
}
}
Das habe ich jetzt für alle meine Kontotypen gemacht. Das Problem ist nun, dass ich nicht weiß, wie ich diese Klasse tatsächlich verwenden soll.
Ich habe zum Beispiel eine Dienstschicht namens PostService und in dieser Klasse habe ich
public void CreatePost(Post post)
{
// do stuff here
}
Bei dieser Methode weiß ich nicht, wie ich überprüfen kann, ob sie die Grenze erreicht haben. Ich weiß nicht, wie ich das überprüfen kann, weil ich nicht weiß, wie ich herausfinden kann, ob ich das FreeLimit oder das PremiumLimit verwenden soll oder welches Konto sie haben.
Ich denke, dass ich zuerst ihre Rolle herausfinden muss und dann irgendwie diese Informationen verwenden muss, um die richtige Klasse zu erstellen.
Ich denke, ich könnte etwas haben wie
public void CreatePost(Post post, PlanType planType)
{
Limits limit;
switch(planType)
{
case planType.Free:
limit = new FreeLmit()
break;
}
if(limit.IsLimitReached())
{
// do stuff
}
}
Mir gefällt dieser Weg nicht, da nun jede Methode, die einen Grenzwert überprüfen muss, dies tun muss. Ich werde ein paar Methoden haben, die diese Prüfung in meiner Dienstschicht erfordern.
Also dachte ich daran, es in meinen Konstruktor zu setzen, aber ich weiß nicht, ob es gut ist, eine Switch-Anweisung in einem Konstruktor zu haben.