我们假设我们有以下课程:
public class Employee
{
public string Name { get; private set; }
public string Team { get; private set; }
public Employee(string name, string team)
{
this.Name = name;
this.Team = team;
}
public void UpdateName(string newName, string updatedBy)
{
this.Name = newName;
this.Update(updatedBy);
}
public void UpdateTeam(string newTeam, string updatedBy)
{
this.Team = newTeam;
this.Update(updatedBy);
}
private void Update(string updatedBy)
{
// and do something with updatedBy
}
}
C#中是否有更好的方法我可以强制执行某种方法(例如UpdateTeam
调用Update
方法并将其传递给字符串参数 - 例如updatedBy
)?
当然没有这样的语法,只是为了说明我的意思:
public class Employee
{
// ...
public void UpdateTeam(string newTeam, string updatedBy) : Update(updatedBy)
{
this.Team = newTeam;
}
private void Update(string updatedBy)
{
// and do something with updatedBy
}
}
编辑:我知道'模板'模式,它不是我需要的。
答案 0 :(得分:1)
我认为模型应该是轻量级的,并且模型类中没有业务逻辑的位置。您应该考虑在单独的类中提取业务逻辑。这个概念可能有所帮助:
public class UpdateNameCommand : ICommand<UpdateNameContext>
{
public void Execute(UpdateNameContext context)
{
UpdateEmployeeName(context.NewName);
UpdateTeam(context.UpdatedBy);
}
private void UpdateEmployeeName(string name)
{
// ...
}
private void UpdateTeam(string updatedBy)
{
// ...
}
}
public interface ICommand<TContext>
{
void Execute(TContext context);
}
其中命令上下文是一个简单的类,负责将数据传递给命令,并且(如果需要)在命令执行后接收结果。
它不一定是命令,而是任何负责业务案例的单独类。其他程序员应该使用它来执行这个特定的操作。这个类(或方法)应该封装必要的逻辑并公开简单的接口以便从外部调用。
关于SOLID principles的好读物。所描述的方法至少涵盖2个原则,可能更多,具体取决于您的应用需求:
S - 单一责任
O - 开放/封闭原则
答案 1 :(得分:0)
将代码添加到Name
和Team
的设置者,它将设置内部属性,然后调用Update
。
UpdatedBy
应该在另一个班级。你现在把2个职责混合成一个班级。
答案 2 :(得分:0)
不,没有比你建议的更好的方法了。 :)
当然还有其他一些方法可以做到这一点(设置属性而不是调用方法,甚至可能调用一个事件,但在所有情况下都需要手动添加该调用。)
您可能需要考虑AOP。 AOP允许您定义一个特殊属性,该属性可以在调用公共方法之前或之后调用方法。当然,您仍然需要手动添加该属性。
有关AOP的更多信息,请查看:https://www.postsharp.net/
答案 3 :(得分:0)
也许您可以尝试使用面向方面编程。似乎AOP可以帮助你。其中一个定义是:
一个方面是一个通常分散的常见特征 方法,类,对象层次结构,甚至整个对象模型。它 是看起来和闻起来应该有结构的行为,但是 你无法在代码中找到表达这种结构的方法 传统的面向对象技术。
因此,您需要通过更改姓名或团队来完成额外的工作。那&#34;额外的工作&#34;不应该与你的代码混在一起,因为你的设计很干净。
这里有一篇非常好的帖子: What is aspect-oriented programming?