1

考虑以下业务实体类。为了验证自己,它需要了解数据库的状态,也许是为了防止某种冲突。因此,为了检索这些数据,它依赖于数据访问层。

拥有一个封装状态、​​验证状态并访问数据存储的类是否违反了单一职责原则?

class MyBusinessObject
{
    private readonly IDataStore DataStore;

    public MyBusinessObject(IDataStore dataStore)
    {
        this.DataStore = dataStore;
    }

    public virtual int? Id { get; protected set; }
    public virtual string Name { get; set; }
    // ... Other properties...

    public IEnumerable<ValidationResult> Validate()
    {
        var data = this.DataStore.GetDataThatInfluencesValidation();
        return this.ValidateUsing(data);
    }

    // ... ValidateUsing method would be in here somewhere ...
}

它给我扔了一面红旗,因为:

  • 在 ASP.NET MVC 控制器的 Create 方法的上下文中,我可能会创建一个新实例并将其传递给我的 View() 方法而不打算进行验证,那么为什么需要我传入 IDataStore?
  • 我正在使用 NHibernate(而且我是菜鸟),看起来我必须创建一个 IInterceptor 来在 NH 创建实体时注入依赖项。也许这会很好,但对我来说感觉有点不对劲。

我开始认为我应该为 NHibernate 使用贫血/DTO 类型的对象,并将其包装在其他知道所有业务规则的东西中,并且如果它依赖于一个数据存储,则可以访问它。现在我已经输入了我的问题和标题,StackOverflow 推荐了一些有趣的资源:herehere

我的问题看起来也与这个问题非常相似,但我想我会以一种更符合我情况的不同方式来问它。

4

1 回答 1

1

“拥有一个封装状态、​​验证状态并访问数据存储的类是否违反了单一职责原则?” ——你列出了三个职责,所以我会回答是。

验证的困难在于它取决于上下文。例如,创建客户记录可能只需要他们的姓名,但向他们销售产品需要付款信息和送货地址。

在 MVC 中,我使用视图模型中的数据注释进行低级别(数据大小和可空性)验证。更复杂的验证是使用规范模式完成的。规范模式易于实现且灵活。

于 2013-01-12T14:25:30.793 回答