如何在每个方法调用后隐式调用一个方法?
对不起,该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")); } } }