C# 我如何执行这些限制(业务限制)?

C# 我如何执行这些限制(业务限制)?,c#,C#,我想我的网站,以支持不同的订阅类型,免费,溢价等 到目前为止,我创建了一个抽象类,如下所示 public abstract class Limits { public int PostLimit { get; protected set; } protected Limits(int postLimit) { PostLimit = postLimit; } public

我想我的网站,以支持不同的订阅类型,免费,溢价等

到目前为止,我创建了一个抽象类,如下所示

  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语句是否好。

你可以使用接口
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
    }
}

您可以使用接口
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
    }
}

那么,
限制
属性与哪个实体相关?我想它和博客(或者论坛)联系在一起,并被保存在DB或其他东西上

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

public void CreatePost(Post post)
{
    if(post.Blog.IsLimitReached())
    {
      // do stuff
    }
}
Blog.isPostLimitReach()
应该从自身调用
this.Limit.isLimitReach


我希望您能理解我所说的:)

那么,
限制属性与什么实体相关?我想它和博客(或者论坛)联系在一起,并被保存在DB或其他东西上

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

public void CreatePost(Post post)
{
    if(post.Blog.IsLimitReached())
    {
      // do stuff
    }
}
Blog.isPostLimitReach()
应该从自身调用
this.Limit.isLimitReach


我希望你能理解我所说的:)

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

如果您有不同类型的用户,您可以将他们的帐户(登录后)绑定到不同的
角色类型。然后你可以使用
HttpContext.Current.User.IsInRole(“RoleName”)
来查看他们是否在一个特定的角色中,并以此作为显示/隐藏功能的基础。

你的意思是有比CreatePost更多的方法需要检查Post,PlanType PlanType?@Caspar Kleijne-这只是我编的一个例子(我真的没有职位限制).PlanType将只是一个枚举,它将保存它们当前所在的计划。我不同意将Limits用作抽象类并从中继承。如果您的子类会因数字不同而不同,为什么要对它们进行子类化?您的意思是有比CreatePost更多的方法需要检查Post,PlanType PlanType?@Caspar Kleijne-这是这只是我编造的一个例子(我真的没有帖子限制).PlanType将只是一个枚举,它将保存它们当前所在的计划。我不同意将Limits用作抽象类并从中继承。如果您的子类会因数字不同而不同,为什么要对它们进行子类化?我在想这个问题,但我不喜欢的是,我每次都需要重复我自己。我是说IsLimitReached是同一个方法,它只做一个if语句。但是现在我写了三次同样的方法。我在想这个问题,但我不喜欢这个问题,我需要每次重复我自己。我的意思是,IsLimitReached是同一个方法,它只做一个if语句。但现在我写了三次同样的方法。我要清楚,您可能需要实现一个基于RoleProvider的类来实现这一点,然后您可以绑定用户帐户(使用.NET内置的成员资格)到不同的角色。这显然只在您要求用户登录时才起作用。为了明确起见,您可能需要实现一个基于RoleProvider的类来实现这一点,然后您可以将用户帐户(使用.NET内置的成员资格)绑定到不同的角色。这显然只在您要求用户登录时起作用。