2010-11-08 97 views
2

這是一個ASP.NET MVC網站。可以從另一個應用程序服務中調用一個應用程序服務嗎?

以下領域驅動設計,我們有一個服務層。我們的控制器要求應用程序服務類執行各種任務,然後將結果發送到視圖。

業務邏輯由服務類執行。

因此,例如,我可能有一個AccountTasks類,它負責註冊用戶,編輯他們的偏好等。現在,我需要能夠在註冊後立即自動訂閱用戶,或者更新他們的用戶偏好(然後我會更改新聞訂閱)。

新聞訂閱功能因此與帳戶註冊/修改密切相關。

但是,我覺得最好有一個單獨的NewsletterTasks服務類來處理訂閱/更新/取消訂閱操作。

但是這個類不會被控制器使用,而是AccountTasks類。

因此,工作流會是這樣:

-> request made to controller action 

-> controller calls AccountTasks 

-> AccountTasks creates a user acoount 

-> AccountTasks calls NewsletterTasks 

-> NewsletterTasks subscribes the user to the newsletter 

-> AccountTasks returns the result to the controller 

-> controller fetches the appropriate view and sends it to the client 

或者,我會控制調用AccountTasks第一,然後使用結果調用NewsletterTasks。但是通過這種方法,我覺得控制器對工作流程知之甚多,而應該只是傳遞數據和結果。

任務是應用程序服務類,該項目基於S#arp架構,其中一些修改來自Who Can Help Me - 其中包括某些事情的命名約定。

可以從AccountTasks撥打NewsletterTasks嗎?你會如何做到這一點?

回答

3

我很想創建一個明確的放在userRegistration域名服務

-> request made to controller action 

-> controller calls UserRegistrationService 

-> UserRegistrationService calls AccountTasks 

-> AccountTasks creates a user acoount 

-> UserRegistrationService calls NewsletterTasks 

-> NewsletterTasks subscribes the user to the newsletter 

-> UserRegistrationService returns the result to the controller 

-> controller fetches the appropriate view and sends it to the client 

這反過來又回答您的問題:是的,它確認從服務

調用其他服務

希望有所幫助!

+0

但是,如果我沒有引入域服務,那麼如果AccountTasks調用NewsletterTasks(並且具有依賴關係,我們使用DI),您認爲它還可以嗎?下面的Szymon說他只是把它放在控制器中,但是如果可以的話,我會盡量讓我的控制器啞巴,並將任何業務邏輯委派給服務類。雖然我不願意再添加一層,但這整個架構對我來說已經是一個巨大的飛躍。 :) – 2010-11-09 10:21:19

+0

我傾向於同意 - 保持控制者'愚蠢'更加符合DDD。我將介紹** UserRegistrationService **的原因是使域操作*顯式*。但是,如果你的團隊說,打電話給AccountTasks-> NewsLetterTasks感覺更自然,那麼就去做吧。 DDD是讓事情變得更容易理解,而且更容易改變。 – 2010-11-09 10:40:45

-1

我會主張控制器調用這兩個任務的設計。是的,它給控制器增加了額外的責任,但另一方面,它消除了AccountTasks調用NewsletterTasks有點尷尬的責任。其他人應該決定是否爲某個特定帳戶訂閱新聞通訊(事件目前是所有用戶都訂閱)。

我會這樣做的務實:只有2個任務,我會把定義工作流程的責任(可能在一個單獨的方法)。隨着任務數量的增長,我將定義一組特殊的類,其唯一目的是定義工作流。

您的設計看起來與Juval Lowy的「The Method」有些相似,您的任務與他的經理有點相似,因此您可以看看他的paper

相關問題