我一直在研究NerdDinner教程,其中的大部分内容都很有意义。我不确定的是为什么直接在Controller中而不是Model对象中使用Repository。例如,如果我们要实现自己的成员资格系统,并且它具有一个带Login方法的AccountController,那么将其挂接到钩子的最佳解决方案是什么?例如

Login(username,password){

    repo = AccountRepository

    account = repo.getLogin(username,password)

    //check account isn't locked

    //check account has been verified etc etc

    //throw error or proceed to secure area

}


要么

Login(username,password){

    repo = AccountRepository

    account = repo.getLogin(username,password)

    account.login() //business logic is handled in Account (Model)

}


要么

Login(username,password){

    //no reference to repository

    account = Account

    //Account (Model) uses repository and handles business logic
    account.login(username,password)

}


我建议让Account对象直接使用AccountRepository,而不是让AccountController从AccountRepository获取信息,然后将其传递给Account对象,例如

NerdDinnner风格:

1登录请求进来
2 AccountController使用AccountRepository根据请求获取登录详细信息
3 AccountController使用Account对象并从步骤1传入信息
4帐户对象处理请求并通知AccountController

我的建议是:

1登录请求进来
2 AccountController使用Account对象根据请求处理登录
3 Account对象使用AccountRepository获取登录详细信息
4帐户对象处理请求并通知AccountController

后一种样式的原因是,从AccountRepository返回登录详细信息后,将遵循一些业务规则,例如是帐户锁定,帐户验证等。如果使用第一种样式,则获取详细信息然后使用它们的逻辑分为两个步骤。后一种样式将所有逻辑保持在一起,同时仍使用AccountRepository,例如

Account.Login(username,password){
    repo = AccountRepository

    account = repo.GetLogin(username,password)

    //check account isn't locked

    //check account has been verified etc etc

    //throw error or proceed to secure area
}


我希望这是有道理的。

最佳答案

mvc中的“模型”是表示模型,而不是域模型。您可以将MVC中的模型视为控制器用来馈送视图引擎的数据传输对象。
控制器是与服务层连接的唯一参与者。

08-26 18:53