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

时间:2015-10-12 07:16:38

标签: c#

很抱歉这篇文章的标题很棒。我有点好奇知道以下问题是否有任何解决方案。情况是我有一个名为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()。我的问题是:

  

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

我的类图看起来像这样

enter image description here

4 个答案:

答案 0 :(得分:8)

您需要查看存储库模式,

分开你的班级和那里的行动,

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

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

Implementing the Repository and Unit of Work Patterns in an ASP.NET MVC Application

编辑添加课程图

您的集合类实际上是存储库类,您需要将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模式......

Implement Observer pattern in C#

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

更多解释,但如果你看一下上面的Observer模式,你就会有所了解。

另一种方法但我个人不推荐的是,使用IDisposable接口,然后在dispose方法中为对象调用SaveSecurity方法。 但我不推荐。

答案 1 :(得分:6)

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

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

你唯一需要做的就是用属性来装饰你想要调用SaveSecurity的方法。

如果您不想使用此类工具,请保持原样。它的方式还可以。

答案 2 :(得分:4)

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

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

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

因此它会包含与原始解决方案相同的额外内容。

不过,也许你的电话中还需要更多。如果您希望即使发生异常也要调用该函数,则需要

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

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

答案 3 :(得分:3)

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Car myCar = new Car();
        myCar.make = "Ferrari";
        myCar.model = "Testa rossa";
        myCar.year = 1999;
        myCar.color = "Red";

        PrintVehicleDetails(myCar);
    }

    private void PrintVehicleDetails(Vehicle _vehicle)
    {
        Console.WriteLine("Here is the car's details: {0}", _vehicle.FormatMe());
    }
}    

abstract class Vehicle
{
    string Make = "";
    string Model = "";
    int Year = 0;
    string Color ="";

    public string make
    {
        get
        { return Make; }

        set
        { Make = value; }
    }

    public string model
    {
        get
        { return Model; }

        set
        { Model = value; }
    }

    public int year
    {
        get
        { return Year; }

        set
        { Year = value; }
    }

    public string color
    {
        get
        { return Color; }

        set
        { Color = value; }
    }

    abstract public string FormatMe();
}

class Car : Vehicle
{
    public override string FormatMe()
    {
        return String.Format("{0} - {1} - {2} - {3}", 
                             this.make, this.model, this.year, this.color);
    }
}