我对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; }
...
}
您不必为服务和存储库创建新实例,并且可以通过配置来管理这些对象的生活方式。最合理的是单例