gpt4 book ai didi

design-patterns - 在 ViewModel 中使用服务层类。设计缺陷?

转载 作者:行者123 更新时间:2023-12-04 22:49:36 24 4
gpt4 key购买 nike

我想知道我的解决方案是否存在设计缺陷。这是我所拥有的:

  • Entities => 纯 poco。引用:没有。
  • Data => 数据访问。引用:Entities .
  • Service => 业务逻辑。引用:EntitiesData
  • 经理类。
  • View 模型。
  • WebApp => 用户界面。引用:EntitiesService
  • WebApp ASP.NET MVC 项目作为 UI, Entities持有纯 POCO 没有引用的项目。 Data访问数据库和 Service用于业务逻辑(我的 Manager 类(class)所在的位置)。

    基本上,我定义了一个 Manager每个实体的类。例如,我有一个 MessageRecipient 列表相关的实体实体。我有一个 MessageManagerRecipientManager类,负责使用数据层和逻辑结果的 CRUD 操作(例如 public List<Message> GetAllMessagesWithPermissionForUser(User user, Permission permission) )

    对于我的 MVC 项目,我在服务层定义了一些 ViewModel 类来为我的 View 生成特定的视频模型。由于 View 模型使用管理器类,我在我的服务类中定义了它们。例如我有一个 MessageOperationVM具有 PermittedBoxesToSend 的 View 模型属性(property)。此属性使用我的 BoxManager获取指定消息允许的所有框的类:
    // Initialized by Catsle Windsor.
    public BoxManager BoxManager {get; set;}

    public List<Box> PermittedBoxesToSend
    {
    if(this._premittedBoxesToSend != null)
    {
    this._permittedBoxesToSend = BoxManager.GetPermittedBoxesToSend(this.Message);
    }
    }
  • 我不确定在 Viewmodels 中使用管理器类是否是一个好的设计。尽管我已将它们定义为构造函数/属性 setter 以填充 DI。我应该在我的 Controller 中填充我的 View 模型的属性而不是定义属性并摆脱我的 View 模型中的管理器类吗?
    public ActionResult ShowNewMessageDialog()
    {
    var messageVM = new MessageOperationVM() { new Message() };
    messageVM = this.BoxManager.GetPermittedBoxesToSend();
    }
  • 为每个实体使用一个管理器类似乎使维护变得困难。 (尽管它们都派生自 BaseManager 类,该类共享它们的共同操作)
  • 上述设计中是否有任何值得一提的重新考虑?

  • 谢谢你。

    更新 :
    基于eulerfx的回答:
    我对你的回答的问题是:要构造一个 ViewModel,我必须调用一些服务层的方法。所以我不能仅仅基于我的 poco 实体来构建我的 ViewModel。您是否建议我也应该在 Controller 中构建这些部分? :
    public ActionResult ShowNewMessageDialog()
    {
    var message = this.messageRepository.GetMessage();
    var messageVM = new MessageViewModel(message);
    messageVM.CustomProperty = this.messageManager.CallSomeMethod(message);
    return View(messageVM);
    }

    最佳答案

    我认为从 View 模型到服务的引用是一个设计缺陷。 View 模型应该是扁平且简单的 DTO,旨在与 View 绑定(bind)。它们不应该是 DI 容器图的一部分,因为这会使事情复杂化并使对代码的推理更加困难。您正在使用的术语的公认定义如下。

  • 实体是您描述的实体。它们是简单的 POCO 类。
  • 你所说的“数据”是repository pattern .存储库提供对底层数据库中实体的访问和持久性。
  • 服务是一个重载的术语,但是它们通常用于封装域,将其作为 API 暴露给其他应用程序层。服务可以引用存储库。我在 DDD 的背景下写了一篇关于这些类型服务的博客文章 here它们被称为应用程序服务。
  • View 模型是表示层或您所称的 WebUI 的一部分。因此,它们由 MVC Controller 构造并传递给 View 。 Controller 使用从应用程序服务或直接从存储库获得的数据构造 View 模型。 View 模型可以包含一个构造函数,该构造函数接受服务或存储库返回的实体。

  • 代码看起来像这样:
    /// Domain model class that lives in domain/business layer project
    public class Message
    {
    // properties and behavior go here
    }

    // View model class that lives in the ASP.NET project
    public class MessageViewModel
    {
    public MessageViewModel() { }
    public MessageViewModel(Message message)
    {
    // construct the view model based on the provided entity
    }
    // properties specific to the view go here
    }


    // ASP.NET MVC controller.
    public class MessagesController : Controller
    {
    // this repository should be injected by DI container.
    readonly IMessageRepository messageRepository;

    public ActionResult ShowNewMessageDialog()
    {
    var message = this.messageRepository.GetMessage();
    return View(new MessageViewModel(message));
    }
    }

    关于design-patterns - 在 ViewModel 中使用服务层类。设计缺陷?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10293351/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com