很抱歉这篇文章的标题很棒。我有点好奇知道以下问题是否有任何解决方案。情况是我有一个名为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()
。我的问题是:
有没有办法在每个函数之后调用此函数,而不是一次又一次地写同一行?
我的类图看起来像这样
答案 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。它将使您能够在调用方法之前和之后定义操作(例如)。可以找到有关它的一些信息here和here。
你唯一需要做的就是用属性来装饰你想要调用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);
}
}