2013-01-11 25 views
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已經提出了一些有趣的資源:herehere

我的問題看起來與this one非常相似,但我想我會以與我的情況更接近的不同方式提問。

回答

1

「是否違反單一責任原則,有一個封裝了狀態,驗證狀態並訪問數據存儲的類?」 - 你列出了三項責任,所以我要回答是的。

驗證的難點在於它取決於上下文。例如,創建客戶記錄可能需要他們的名字,但向他們出售產品需要付款信息和送貨地址。

在MVC中,我使用視圖模型中的數據註釋進行低級別(數據大小和可空性)驗證。使用specification pattern進行更復雜的驗證。規範模式易於實施和靈活。

+0

很酷,我還沒有聽說過規範模式。我今天也通過[這個答案](http://stackoverflow.com/a/8923129/674077)發現了[FluentValidation](http://fluentvalidation.codeplex.com/)。它似乎在內部使用該模式,FluentValidation.Validators名稱空間中的每個類表示一個規範。謝謝! – Andrew

+0

我想我也想知道是否可以說類的「單一職責」是實現與特定類型的業務對象相關的業務問題。另一方面,我不想將SRP過多。例如,我不久前編寫了一個項目,每個項目只有一個方法。 – Andrew

+1

意見有所不同,但我認爲商業課的責任是保持狀態並封裝狀態(例如,狀態更改和狀態日期更改必須一起發生)。 –

相關問題