1
考慮以下業務實體類。爲了驗證自己,它需要知道一些關於數據庫狀態的信息,可能是爲了防止某種衝突。因此,它依賴於數據訪問層來檢索這些數據。訪問數據存儲以驗證其自身的業務實體:SRP違規?
是否違反了單一責任原則,有一個封裝了狀態,驗證狀態並訪問數據存儲的類?
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控制器的創建方法的情況下,我可能會做一個新的實例,並把它傳遞給我的視圖()方法無意驗證,爲什麼我需要通過IDataStore?
- 我正在使用NHibernate(我是一個noob),它看起來像我必須創建一個IInterceptor注入依賴關係,只要NH創建實體。也許這很好,但對我來說感覺有點不對勁。
我開始想我應該用一個貧血/ DTO類型的對象NHibernate的使用,幷包裹裏面別的東西,知道所有的業務規則,如果它依賴於一個可以訪問的數據存儲。現在我已經鍵入了我的問題和標題,StackOverflow已經提出了一些有趣的資源:here和here。
我的問題看起來與this one非常相似,但我想我會以與我的情況更接近的不同方式提問。
很酷,我還沒有聽說過規範模式。我今天也通過[這個答案](http://stackoverflow.com/a/8923129/674077)發現了[FluentValidation](http://fluentvalidation.codeplex.com/)。它似乎在內部使用該模式,FluentValidation.Validators名稱空間中的每個類表示一個規範。謝謝! – Andrew
我想我也想知道是否可以說類的「單一職責」是實現與特定類型的業務對象相關的業務問題。另一方面,我不想將SRP過多。例如,我不久前編寫了一個項目,每個項目只有一個方法。 – Andrew
意見有所不同,但我認爲商業課的責任是保持狀態並封裝狀態(例如,狀態更改和狀態日期更改必須一起發生)。 –