如何实施这些限制(业务限制)?

时间:2011-01-31 18:31:59

标签: c#

我希望我的网站支持不同的订阅类型,免费,高级等。

到目前为止,我创建了一个类似于

的抽象类
  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语句是否合适。

3 个答案:

答案 0 :(得分:0)

您可以使用界面ILimit

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

现在您可以使用其他几个类(Free,Premium,Super)来实现此接口。在您的服务方法CreatePost中,您只需传递实现该接口的类的任何实例并使用它 - 由于它们都支持相同的接口,因此无需再区分它们。

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

答案 1 :(得分:0)

那么,Limit属性与哪个实体相关联?我认为它与博客(或者可能是论坛)相关联,并且它会持久保存在数据库或其他内容上。

如果是这样,你可以这样做:

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

Blog.IsPostLimitReached()应该自己调用this.Limit.IsLimitReached

我希望你能理解我说的话:)。

答案 2 :(得分:0)

如果您有不同类型的用户,则可以将其帐户(一旦登录后)绑定到不同的RoleTypes。然后,您可以使用HttpContext.Current.User.IsInRole("RoleName")查看他们是否处于特定角色,并将其用作显示/隐藏功能的基础。