Microsoft MVC中服务层和存储库的设计

时间:2011-05-20 13:36:43

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

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

  • 表格中的评论备注
  • HourRegistrations表中的条目
  • Tickets
  • 的更改日志中的条目

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

示例:

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

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

我可以改变方法的签名并提供int TicketId,但这感觉不对。此外,我接下来会遇到类似的问题。

我的存储库是在服务类的构造函数中创建的。也许我必须在方法的开头创建它们?即便如此,我必须经常转移ID而不是真实的物体。

1 个答案:

答案 0 :(得分:3)

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

当IoC启动并运行时创建ContextManager。 Somethig喜欢这样:

public class ContextManager : IContextManager
{
    private XContext context;

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

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

修改

您还必须创建自己的controllerFactory

然后您可以使用您的服务和存储库:

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

...

}

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