如何在每个方法调用后隐式调用一个方法?

对不起,该post的标题很棒。 我有点好奇知道以下问题是否有任何解决方案。 情况是我有一个名为SaveSecurity();的函数SaveSecurity(); 我需要在每个function后调用它。 如下所示:

 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() 。 我的问题是:

有没有办法在每个函数之后调用此函数,而不是一次又一次地写同一行?

我的类图看起来像这样

在此处输入图像描述

您需要查看存储库模式,

分开你的课程和那里的行动,

创建另一个层(称为业务层)或任何将调用不同类的不同方法的层…

ATM你试图跟随OOP,但你所做的只是函数式编程..

在ASP.NET MVC应用程序中实现存储库和工作单元模式

编辑添加类图后

您的集合类实际上是存储库类,您需要将deletePermissions,deleteRole等方法移动到各自的存储库类,例如permissionsRepo(如果需要,将其命名为集合)和roleRepo。

所以你已经拥有了一个对象类和一个对象的存储库类(可以在一起),但我喜欢将它们分开,repostory类将做他们需要做的事情,比如..

 // 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#中实现Observer模式

每次你的对象改变它的状态你就可以调用SaveSecurity方法(它将在另一个类中(Name it SaveSecurity可能)。如果你不想为每个对象更改调用SaveSecurity ,你可以向对象添加一个属性,例如IsSecurityChanged ?如果是,则调用SaveSecurity。

更多解释,但如果你看看上面的Observer模式,你会得到一个想法。

还有一种方法,但我个人不会建议使用IDisposable接口,然后在dispose方法中为对象调用SaveSecurity方法。 但我不推荐它。

只有C#你不能,但有一些解决方案可能有所帮助。

我所知道的最好的是PostSharp 。 它将使您能够在调用方法之前和之后定义操作(例如)。 有关它的一些信息可以在这里和这里找到。

您唯一要做的就是使用属性来装饰要为SaveSecurity调用的方法。

如果您不想使用此类工具,请保持原样。 这样就好了。

您可以使用某种面向方面的编程(不知道如何在C#中执行此操作,但尝试使用Google搜索)。

另一种方法不仅仅是简单地在另一个函数的末尾调用一个函数,而是使用函数参数创建辅助函数,该函数执行其参数然后调用您的安全函数。 但是每个函数的主体看起来都像(如果我正确记得C#lambda):

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

所以它会包含与原始解决方案一样多的东西。

顺便说一句,也许你还需要更多的电话。 如果您希望在exception发生时调用该函数,则需要

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

并将其隐藏到function助手中是有道理的。

 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(Func 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")); } } }