c# - 分离此代码关注点的最佳方法是什么?

标签 c# separation-of-concerns

previous question 中来自 Dr. Herbie 的评论之一接受的答案是我的方法执行两项职责..更改数据和保存数据。

我想找出的是在我的情况下区分这些问题的最佳方法。

继续我的例子,有一个通过 NHibernate 检索的 Policy 对象....

我目前将策略设置为不活动的方式如下:

Policy policy = new Policy();
policy.Status = Active;

policyManager.Inactivate(policy);

//method in PolicyManager which has data access and update responsibility
public void Inactivate(Policy policy)
{
    policy.Status = Inactive;
    Update(policy);
}

如果我要将数据访问和数据更新的责任分开,最好的方法是什么?

让 PolicyManager(充当 dao 的网关)管理 Policy 对象的状态是否更好:

Policy policy = new Policy();
policy.Status = Active;

policyManager.Inactivate(policy);
policyManager.Update(policy);

//method in PolicyManager
public void Inactivate(Policy policy)
{
    policy.Status = Inactive;
}

或者让 Policy 对象维护它自己的状态,然后使用管理器类将信息保存到数据库:

Policy policy = new Policy();
policy.Status = Active;

policy.Inactivate();

policyManager.Update(policy);

//method in Policy
public void Inactivate()
{
    this.Status = Inactive;
}

最佳答案

我会做什么:

  • 创建一个用于保存和检索策略的存储库。 (策略存储库)

  • 如果您有必须执行以激活/停用策略的复杂逻辑,您可以为此创建一个服务。如果该服务需要访问数据库,则可以在必要时将 PolicyRepository 传递给它。 如果不涉及复杂的逻辑,并且激活/停用策略只是将标志设置为 false 或 true 的问题,或者如果仅涉及策略类的成员,那么为什么“已激活”不是策略的简单属性您可以设置为 false/true 的类? 如果涉及其他对象,或者如果需要数据库访问来激活或停用策略,我只会创建服务。

关于c# - 分离此代码关注点的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1425681/

相关文章:

asp.net-mvc - 如何告诉 Ninject 绑定(bind)到它没有引用的实现

c# - 我的着色器在桌面上工作,但屏幕在 Android 上变黑

c# - 使用状态和工厂设计模式管理状态和验证规则

c# - Android 应用程序中的 Process.Start() 访问被拒绝 (0x80004005)

model-view-controller - 在 JSF2 托管 bean 中实现 MVC 的最佳实践

ruby-on-rails - 如何嵌套采集路线?

c# - .net 类或可以帮助我创建系统备份镜像文件的有用的东西

c# - 如何以编程方式确定表是否存在于 SQL Server CE 数据库中?

angularjs - Angular 应用程序中的哪个位置是存储 "shared"数据的好地方

entity-framework - 使用Unity,如何注册泛型的类型映射?