簡體   English   中英

如何在每次方法調用后隱式調用方法?

[英]How to call a method implicitly after every method call?

抱歉,帖子的標題很棒。 我很想知道下面的問題是否有解決方案。 情況是我有一個名為SaveSecurity();的函數SaveSecurity(); 我需要在每個函數之后調用該函數。 如下所示:

public void AddUser(string ID, string Name, string Password)
{
    ///some codes
    SaveSecurity();
}
public void DeleteUser(User ObjUser)
{
    ///some codes
    SaveSecurity();
}
public void AddPermission(string ID, string Name, AccessType Access)
{
    ///some codes
    SaveSecurity();
}
public void DeletePermission(Permission ObjPermission)
{
    ///some codes
    SaveSecurity();
}
public void AddRole(string ID, string Name)
{
    Roles.AddRole(ID, Name);
    SaveSecurity();
}
public void SaveSecurity()
{
    ///Saves the data
}

還有很多。 因此,現在讓我們看一下與所有功能的相似之處是,最后在功能結束后需要調用SaveSecurity() 我的問題是:

有沒有一種方法可以在每個函數之后一次又一次地寫同一行來調用此函數?

我的班級圖看起來像這樣

在此處輸入圖片說明

您需要研究存儲庫模式,

分開您的課程和那里的操作,

創建另一個層(稱為業務層)或將要調用不同類的不同方法的任何層...

您正在嘗試遵循OOP的ATM,但是您所做的只是函數式編程。

在ASP.NET MVC應用程序中實現存儲庫和工作單元模式

添加類圖后編輯

您的集合類實際上是存儲庫類,您將需要將諸如deletePermissions,deleteRole之類的方法移至相應的存儲庫類,如PermissionsRepo(如果需要,將其命名為集合)和roleRepo。

因此,您已經有一個對象類和一個對象的存儲庫類(可以在一起),但是我想將它們分開,重新發布類將完成它們需要做的事情,例如。

// Make changes to DB
// Make changes to AD
// Makes changes to web services etc...

您的經理類可能會使存儲庫類的方法重復,但它們只會調用它們,

PermissionManager.DeletePermissions(PermissionObject);

然后在PermissionManager類中,您將擁有方法,

DeletePermissions(Permissions pObject)
{
     PermissionRepo.Delete(pObject);
}

上面只是增加了一層,以使您的代碼在很短的時間內看起來更具可讀性和將來的證明,但是如果您有更多的時間進行投資,您也可以研究Observer模式...

在C#中實現觀察者模式

每次您的對象更改狀態時,您可以調用SaveSecurity方法(將在另一個類中(可能會為其命名)。如果您不想為每次對象更改調用SaveSecurity ,則可以向對象添加屬性,例如IsSecurityChanged ?如果是,則調用SaveSecurity。

有更多的解釋,但是如果您看一下上面的Observer模式,您將會有一個想法。

但我個人不建議使用另一種方法,即使用IDisposable接口,然后在dispose方法中為該對象調用SaveSecurity方法。 但是我不推薦它。

僅使用C#不能,但是有些解決方案可能會有所幫助。

我所知道的最好的是PostSharp 它將使您能夠在調用方法之前和之后定義操作(例如)。 關於此的一些信息可以在這里這里找到。

然后,您唯一要做的就是用屬性裝飾要調用SaveSecurity的方法。

如果您不想使用此類工具,請保持原樣。 沒關系,就是這樣。

您可以使用某種面向方面的編程(不知道如何在C#中進行,而是嘗試對其進行谷歌搜索)。

除了簡單地在另一個函數的末尾調用一個函數外,另一種方法不是更好,它是創建具有函數參數的幫助程序函數,該函數執行該函數的參數,然后調用您的安全函數。 但是每個函數的主體看起來像(如果我正確記得C#lambda):

CallAndSaveSecurity(() => /* some code */);

因此,它將包含比原始解決方案更多的東西。

順便說一句,也許您仍然需要更多電話。 如果您希望即使在異常發生時也要調用該函數,則需要

try{
  // some code
} finally {
  SaveSecurity();
}

並將其隱藏在功能助手中是有道理的。

using System;

namespace Shweta.Question
{
   public class User
   { }
   public class Permission
   { }

   public enum AccessType
   {
      none,
      full,
      other
   }

   public class Roles
   {
      public static void AddRole(string id, string name)
      {
      }
   }

   public class Shweta
   {
      public void AddUser(string ID, string Name, string Password)
      {
         ///some codes
         SaveSecurity();
      }
      public void DeleteUser(User ObjUser)
      {

      }
      public void AddPermission(string ID, string Name, AccessType Access)
      {

      }
      public void DeletePermission(Permission ObjPermission)
      {

      }
      public void AddRole(string ID, string Name)
      {
         Roles.AddRole(ID, Name);
      }
      public void SaveSecurity()
      {
         ///Saves the data
      }

      public TResult CallMethod<TResult>(Func<TResult> func)
      {
         try
         {
            return func();
         }
         catch (Exception e)
         {
            // Add Handle Exception

            // replace the next line by exception handler
            throw e;
         }
      }

      public void CallMethod(Action method)
      {
         this.CallMethod(() => { method(); return 0; });

         this.SaveSecurity();
      }

      public static void test()
      {
         var s = new Shweta();
         s.CallMethod(() => s.AddRole("theId", "theName"));
         s.CallMethod(() => s.DeleteUser(new User()));
         s.CallMethod(() => s.AddPermission("theId", "theName", AccessType.full));
         s.CallMethod(() => s.DeletePermission(new Permission()));
         s.CallMethod(() => s.AddRole("theId", "theName"));
      }
   }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM