【问题标题】:Design of Service Layer and Repositories in Microsoft MVCMicrosoft MVC 中服务层和存储库的设计
【发布时间】:2011-05-20 13:36:42
【问题描述】:

我在使用 Microsoft MVC 时遇到以下问题 - 或者更确切地说,迫切需要宝贵的建议。来自客户端的某个动作导致创建:

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

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

例子:

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

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

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

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

【问题讨论】:

    标签: asp.net-mvc linq design-patterns repository


    【解决方案1】:

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

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

    public class ContextManager : IContextManager
    {
        private XContext context;
    
        public XContext GetContext()
        {
            return context ?? (context = XContext.Create());
        }
    }
    

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

    编辑

    您还必须创建自己的控制器工厂

    那么您可以像这样使用您的服务和存储库:

    public class MyController : Controller
    {
        public ISomeService SomeService { get; set; }
        public IContextManager ContextManager { get; set; }
    
    ...
    
    }
    

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

    【讨论】:

    • 术语 DI 和 IoC 不可互换,意味着两个不同的东西。您可以使用 DI 实现 IoC。 Windsor、Unity、Ninject 是用于反转控制的 DI 框架。 ;)
    • 所以在控制器动作开始时我应该初始化一个上下文管理器并从中取出必要的对象?我可以从服务层访问上下文管理器而不在那里显式提供它吗?或者这是服务层中的一个解决方案,因为我可以使用所需的数据上下文创建存储库。
    • @Paul 使用控制器的构造函数来包含 ContextManager 依赖项。对服务层类执行相同的操作。不要在你的方法中实例化 ContextManager。
    • 感谢您的回答!目前我认为最合理的解决方案确实是在控制器中创建一个数据上下文。从那里我可以初始化服务层。服务层可以初始化存储库。所以整个“链”将共享相同的数据上下文。
    猜你喜欢
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 2018-09-15
    • 2011-04-02
    • 2017-09-19
    相关资源
    最近更新 更多