Asp.net mvc 2 视图模型->;型号:Who';谁负责持久性逻辑?

Asp.net mvc 2 视图模型->;型号:Who';谁负责持久性逻辑?,asp.net-mvc-2,persistence,repository,viewmodel,Asp.net Mvc 2,Persistence,Repository,Viewmodel,在我的ASP MVC 2应用程序中,我使用特定的视图模型遵循强类型视图模式 我的应用程序viewmodels负责模型和viewmodels之间的转换我的viewmodels我有一个静态ToViewModel(…)函数,它为相应的模型创建一个新的viewmodel。到目前为止,我对此没有意见 当需要编辑模型时,我会通过导线发送创建的viewmodel,并将更改应用回模型。为此,我使用了一个静态的ToModel(…)方法(也在视图模型中声明)。下面是要澄清的存根: public class User

在我的ASP MVC 2应用程序中,我使用特定的视图模型遵循强类型视图模式

我的应用程序viewmodels负责模型和viewmodels之间的转换
我的viewmodels我有一个静态
ToViewModel(…)
函数,它为相应的模型创建一个新的viewmodel。到目前为止,我对此没有意见

当需要编辑模型时,我会通过导线发送创建的viewmodel,并将更改应用回模型。为此,我使用了一个静态的
ToModel(…)
方法(也在视图模型中声明)。下面是要澄清的存根:

public class UserViewModel
{
    ...
    public static void ToViewModel(User user, UserViewModel userViewModel)
    {
        ...
    }

    public static void toModel(User user, UserViewModel userViewModel)
    {
        ???
    }
}
所以,现在我的“问题”: 有些模型很复杂(不仅仅是字符串、整数等)。因此,持久性逻辑必须放在某个地方
(使用持久性逻辑我指的是决策是否创建新的数据库条目,…而不仅仅是粗略的CRUD-我使用存储库)

我认为将它放在我的存储库中不是一个好主意,因为存储库(在我的理解中)不应该关心来自视图的东西。
我考虑过将它放在
ToModel(…)
方法中,但我不确定这是否是正确的方法

你能给我一个提示吗

Lg

warappa

warappa-我们同时使用存储库模式和视图模型

但是,我们有两个附加层:

  • 服务
  • 任务
服务层处理持久化关系数据(复杂对象模型)等内容。任务层处理数据的奇特linq关联以及向viewmodel呈现正确数据所需的任何额外操作

除此之外,我们还为每个实体提供了一个“过滤器”类。这使我们能够在需要时针对每个类的扩展方法


简单…:)

在我们的MVC项目中,我们有一个单独的转换器位置

我们有两种类型的转换器,一种是IConverter,另一种是ITwoWayConverter(比这个多了一点,但我保持简单)

ITwoWayConverter包含两个主要方法ConvertTo和ConvertFrom,其中包含将模型转换为视图模型的逻辑,反之亦然

通过这种方式,您可以创建用于在类型之间切换的特定转换,例如:

public class ProductToProductViewModelConverter : ITwoWayConverter<Product,ProductViewModel>
公共类ProductToProductViewModelConverter:ITwoWayConverter
然后根据需要将相关转换器注入控制器


这意味着您从一种类型到另一种类型的转换不受单个转换器(存储在模型内或任何地方)的限制。

“这意味着您从一种类型到另一种类型的转换不受单个转换器(存储在模型内或任何地方)的限制”很好@主题:您的转换器只进行转换,但从不进行持久性转换,我做对了吗?我们的转换器只处理转换。考虑单一责任。因此,您的服务层类(即UserService)包含对服务所需的存储库的引用。在ie中,编辑操作由服务功能决定是否创建、更新或删除子对象。对吗?warappa-存储库要么根据需要注入,要么作为方法中的具体实例创建。因此,是的,基本服务模型是一个Abstract类,它提供了一个包含所有常见toot(crud)的注入存储库。如果需要,这个重写服务类可以选择重写服务的任何基本方法。谢谢,现在我知道该怎么做了!瓦拉帕-很高兴你理解了我的闲话:)更新了标题,直接关注持久性逻辑的放置位置