我有以下问题 - 或者更确切地说,迫切需要有价值的建议 - 与Microsoft MVC。来自客户的某个动作导致创建:
我将服务层用于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而不是真实的物体。
答案 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; }
...
}
您不必为服务和存储库创建新实例,您可以从配置中管理这些对象生活方式。最合理的是单身人士