考虑以下业务实体类。为了验证自己,它需要了解数据库的状态,也许是为了防止某种冲突。因此,为了检索这些数据,它依赖于数据访问层。
拥有一个封装状态、验证状态并访问数据存储的类是否违反了单一职责原则?
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 推荐了一些有趣的资源:here和here。
我的问题看起来也与这个问题非常相似,但我想我会以一种更符合我情况的不同方式来问它。