Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在调用类方法时自动调用方法?_C# - Fatal编程技术网

C# 在调用类方法时自动调用方法?

C# 在调用类方法时自动调用方法?,c#,C#,假设我有一个基本服务类,一旦被继承,它将通过方法公开一组服务。在运行之前,每个方法都应该执行访问检查,以查看正在运行的用户是否有权使用所述服务。 现在,我不想把这个留给派生我的类的人 有没有办法让每个方法自动调用某个方法并根据该方法返回的数据中止或分支? 我希望这对实现子类的人来说尽可能透明 提前感谢。这实际上是模板方法设计模式的一个基本用例 abstract class ServiceBase { public bool ServiceMethod() { if

假设我有一个基本服务类,一旦被继承,它将通过方法公开一组服务。在运行之前,每个方法都应该执行访问检查,以查看正在运行的用户是否有权使用所述服务。 现在,我不想把这个留给派生我的类的人

有没有办法让每个方法自动调用某个方法并根据该方法返回的数据中止或分支? 我希望这对实现子类的人来说尽可能透明


提前感谢。

这实际上是模板方法设计模式的一个基本用例

abstract class ServiceBase
{
    public bool ServiceMethod()
    {
        if (!CheckMethod())
        {
            return false;
        }

        return ServiceMethodImpl();
    }

    protected abstract bool ServiceMethodImpl();

    private bool CheckMethod()
    {
        // ...
    }
}
您只需要让派生类实现核心功能,但在基类中执行所需的检查

这样,派生类就无法克服检查,也不需要关心

派生类只需实现核心功能:

class ServiceImpl : ServiceBase
{
    protected override bool ServiceMethodImpl()
    {
        // ...
    }
}

如果我理解你的问题,你可以这样做:

public /* abstract */ class ServiceBase
{

  private void CheckAccess()
  {
    if ( DontHaveAccess )
      throw new NoAccessException();
  }

  public void ActionToDo()
  {
    CheckAccess();
    DoActionToDo();
  }

  protected virtual /* or abstract */ void DoActionToDo()
  {
  }

}

没有什么能自动为你做任何事情。您必须在自己的代码库中自己构建它。您可以跟踪标志、使用属性或使用某种类型的DI,并实现AOP功能(面向方面的编程/关注点的交叉)。但它的缺点是它将是代码,实现将依赖于其他因素(如您期望它如何运行、调用上下文等)。但是我们需要知道基类是什么样子的。我能想到的最简单的答案是在基类的构造函数中启动所有自动调用的方法。@Casey Crookston…我就是这么想的…在构造函数中。只是不要让用户创建派生类,也不必做任何特殊的事情。换句话说,在基类构造函数中执行访问检查。为什么会有人投票关闭此问题?这真是个好问题!谢谢你的回复。这可能是最好的办法。干杯谢谢你的回复。我在想一些关于冒泡的代表的事情,不知怎么的拦截电话,但很可能就是这样。