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



我对MVC有以下问题 - 或者更确切地说,迫切需要有价值的建议 - Microsoft。客户端的某个操作会导致创建:

  • 表中的备注 备注
  • 小时注册表中的条目
  • 工单更新日志中的条目

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

例:

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

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

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

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

我的建议是使用依赖注入(或控制反转 - 取决于你想如何称呼它)。我用自己城堡温多尔。与 mvc.net 集成非常简单。阅读更多

当 IoC 启动并运行时,创建上下文管理器。索梅西格是这样的:

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; }
...
}

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

相关内容

  • 没有找到相关文章

最新更新