gpt4 book ai didi

asp.net-mvc - Microsoft MVC 中服务层和存储库的设计

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

对于 Microsoft MVC,我有以下问题 - 或者更确切地说,迫切需要有值(value)的建议。来自客户端的某个 Action 导致创建:

  • 表中备注备注
  • HourRegistrations
  • 表中的条目
  • 工单变更日志中的条目

  • 我将服务层用于业务操作,将存储库用于 CRUD 操作。问题是我有时需要连接来自不同 DataContexts 的对象,所以我想我使用了有缺陷的设计。最近我们开始从我们的 Controller 和存储库中删除所有业务逻辑,这是我遇到的第一件事。

    例子:
    BLogic.AddRemarks(Ticket t, ...)
    {
    Remark r = _remarksRepository.Create();
    r.Ticket = t;
    _remarksRepository.Add(r);
    _remarksRepository.Save();
    }

    这会触发 kBOOM,因为 Ticket 是使用存储库在 Controller 中获取的。所以 Remark r 和 Ticket t 不共享相同的数据上下文。

    我可以更改方法的签名并提供一个 int TicketId,但这感觉不对。此外,我随后会遇到类似的问题。

    我的存储库是在服务类的构造函数中创建的。也许我必须在方法开始时创建它们?即使这样,我也必须经常转移 Id 而不是真实的对象。

    最佳答案

    我的建议是使用依赖注入(inject)(或控制反转——取决于你想怎么称呼它)。我用自己的城堡windor。与 mvc.net 集成非常简单。 read more

    当 IoC 启动并运行时,创建 ContextManager。像这样的东西:

    public class ContextManager : IContextManager
    {
    private XContext context;

    public XContext GetContext()
    {
    return context ?? (context = XContext.Create());
    }
    }

    将 IContextManager 生活方式设置为 perwebrequest,您就可以获得可以从存储库和服务访问的上下文。每个请求都是一样的。

    编辑

    您还必须创建自己的 Controller 工厂

    那么您可以像这样使用您的服务和存储库:
    public class MyController : Controller
    {
    public ISomeService SomeService { get; set; }
    public IContextManager ContextManager { get; set; }

    ...

    }

    您不必为服务和存储库创建新实例,您可以通过配置管理这些对象的生活方式。最合理的是单例

    关于asp.net-mvc - Microsoft MVC 中服务层和存储库的设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6072707/

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