2011-11-29 60 views
2

你正在使用你自己的版本的計算器:-)什麼地方適合商業邏輯?

你正在使用ASP.NET MVC和實體框架(模型優先的方法,如果它很重要)。所以,你有一對夫婦由EF生成的類:

class Question {...} 
class Answer {...} 

還擁有所有相關的東西(ObjectContext等)。你把所有的相關的代碼來處理回答這個問題的方案(StackoverflowControllerAnswerQuestion [獲得] + AnswerQuestion [文章]動作,也爲了顯示一個奇特的形式 - Stackoverflow/Answer)。

你的客戶是一個非常艱難的傢伙,所以他定義了一套商業規則:

  1. 沒有人應該能夠回答這個問題在第5分鐘的問法後(他們應該得到的消息)。
  2. 答案發布後,主題發起人應收到通知。
  3. 主頁面應該顯示20個最新的問題。
  4. 當顯示的每一個問題的答案,就應該通過投票排序。
  5. 當問題與總的-10 downvoted,它們應該被關閉。
  6. 當答案,總的-10 downvoted,他們的海報應該得到的-20抗獎金他們的聲譽。

的問題是 - 鑑於上述事實,你會在哪裏實現客戶的業務規則?

我真的不喜歡具有類似於代碼的想法:

public class HomeController : Controller 
{ 
    ... 
    public ActionResult Index() 
    { 
     return View(_container.Questions.OrderByDescending(x => x.Posted).Take(20).ToList()); 
    } 
} 

但你會如何命名這個邏輯正確的地方?它應該有什麼接口?是這樣的:

// implements the business logic, interacts with repositories 
public static class Stackoverflow 
{ 
    public static IEnumerable<Question> GetRecentQuestions() { ... } // logic here! 
    public static void PostAnswer(Question question, Answer answer) { ... } // logic here! 
} 

+0

這種話語,開放式問題真正屬於http://programmers.stackexchange.com – APC

+0

標記爲移動到程序員.stackexchange.com – agibalov

+1

典型的遊戲開發者響應:「您應該使用StackoverflowManager類,它應該是靜態的。此外,確保靜態實例始終具有一種極其複雜的狀態。」 ^。^ –

回答

3

一種解決方案是使用一個服務層來處理這給你:

public Interface IStackoverflowService 
{ 
    IEnumerable<Question> GetRecentQuestions(); 
    void PostAnswer(Question question, Answer answer); 
} 

public class StackoverflowService : IStackoverflowService 
{ 
    private StackoverflowDbContext _container; 

    public StackoverflowService(StackoverflowDbContext container) 
    { 
     _container = container; 
    } 

    public IEnumerable<Question> GetRecentQuestions() 
    { 
     var model = _container.Questions.OrderByDescending(x => x.Posted); 
     return model.Take(20); 
    } 

    public void PostAnswer(Question question, Answer answer) { ... } 
} 

然後在你的控制器:

public class HomeController : Controller 
{ 
    private IStackoverflowService _stackoverflowService; 

    public HomeController(IStackoverflowService stackoverflowService) 
    { 
     _stackoverflowService = stackoverflowService; 
    } 

    public ActionResult Index() 
    { 
     var model = _stackoverflowService.GetRecentQuestions(); 
     return View(model); 
    } 
} 

你甚至可以打破它出成多個服務,如QuestionsServiceAnswersServiceUsersService

+0

很好的回答,建議把對StackOverflowService的接口,因此它可以被嘲笑的單元測試。 – jeremyalan

+0

@jeremyalan添加界面的一個例子。 – shuniar

+0

這個服務應該提供一個訪問存儲庫的例子,例如「通過ID獲取問題」嗎?還是應該將'GetQuestionById()'作爲'IStackoverflowService'的成員? – agibalov