控制器或模型中的存储库?

时间:2009-05-15 22:02:28

标签: asp.net-mvc model controller repository-pattern

我一直在研究NerdDinner教程,其中大部分都是有道理的。我不确定的是为什么Repository直接在Controller中使用而不是Model对象。例如,如果我们想要实现我们自己的会员系统并且它有一个带有Login方法的AccountController,那么连接它的最佳解决方案是什么? e.g。

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

}

OR

Login(username,password){

    repo = AccountRepository

    account = repo.getLogin(username,password)

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

}

OR

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帐户对象使用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
}

我希望这是有道理的。

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

您至少应该有另一个负责与存储库接口交互的层(不是控制器)。 Thil允许为另一个更改de UI(控制器是其中的一部分)。通过这种方式,无论是命令行,桌面还是Web界面都无关紧要。

在ASP.NET MVC中,我更喜欢在单独的项目中使用模型(不是我的域模型,MVC),而不是MVC模型。这允许与其他类型的UI共享DTO(MVC模型)。

答案 2 :(得分:1)

存储库是基础设施问题。您正在做的是让您的模型依赖于您的基础架构。这是一种落后的做法。这意味着如果你想做一些事情,比如使用依赖注入,你就必须从你的容器中解析你的模型,这对我来说没有多大意义。

另外,关键不是要将所有东西都放在一个地方。您应该努力将您的问题分成逻辑单元。通过这种方式,您可以轻松识别应用程序的哪些部分。它也适合测试。

答案 3 :(得分:1)

我会说这不是执行登录的帐户,而是使用该帐户登录应用程序,因此在帐户上调用Login方法似乎有点不自然。< / p>

在Domain Driven Design中,有一个不适合Account类的业务逻辑:这称为服务。您可以阅读有关DDD服务的更多信息,例here

答案 4 :(得分:0)

我会避免将您的数据访问权限放在模型中。这很可能导致模型对存储机制的依赖。我通常将此逻辑放在服务/业务逻辑层中,该层将与数据层和模型进行对话。在你的情况下只有模型和控制器,它将是执行这项工作的控制器。

我认为领域模型是一组玩具或工具,你可以拿起,使用,操纵等等。玩具并不关心它们存储的位置,也不应该关注它们。您应该能够将玩具放在架子上或工具箱中。它不会影响玩具。