如何处理我的DbContext
本文关键字:我的 DbContext 处理 何处理 | 更新日期: 2023-09-27 18:26:06
我很难将我的单片ASP.NET MVC应用程序拆分为N层应用程序。在下面的示例中,在对_messageRepo.Create()的第一次调用过程中,会抛出一个异常,表示DbContext已被释放,因此无法使用。
我看不出这是怎么发生的,尝试中断Dispose()方法实际上不会导致应用程序在调试期间中断。
基本结构如下:
- 控制器注入了它们使用的每个服务的实例//ie:public MyController(IMessageService messageService)
- 服务包含任何所需的存储库实例(即:_messageRepository)
- 存储库使用MyContext的一个实例,这是DbContext
如以下示例所示,只要需要,就会重建这些实例
using(var context = new MyContext()) { _messageRepo = new MessageRepository(context); _idRepo = new IdentityRepository(context); var status = _messageRepo.GetStatus(Int32.Parse(message.To)); message.To = status.Header.From.Name; message.ToHash = Obfuscate.SaltAndHash(message.To); message.Subject = "RE:" + status.Header.Subject; var toUser = _idRepo.Get(message.To); var fromUser = _idRepo.Get(_userName); var rawMessage = new Message() { Content = message.Content, Attachments = GetAttachments(message.AttachmentIds) }; var header = new MessageHeader() { To = toUser, From = fromUser, Subject = message.Subject }; _messageRepo.Create(new MessageStatus() { CreatedAt = DateTime.Now, IsRead = false, IsSpam = false, IsTrash = false, Message = rawMessage, Header = header, Owner = header.To }); _messageRepo.Create(new MessageStatus() { CreatedAt = DateTime.Now, IsRead = false, IsSpam = false, IsTrash = false, Message = rawMessage, Header = header, Owner = header.From }); context.Commit(); Email.SendNewMessageNotification(fromUser.Email, toUser.Email); }
存储库方法是LINQ一行程序,使用代码优先的方法通过实体框架从数据库中检索模型。
这种方法有什么问题吗?起初,我确实让MyContext实现了IUnitOfWork,但我删除了它,直到我让这个不那么复杂的方法发挥作用。
此外,我正在使用IoC框架(AutoFac)来加载这些接口实现的实例。如果这就是问题所在,那么我需要对我的逻辑进行哪些更改才能适应AutoFac?
//in Global.asax.cs
builder.RegisterType<PonosContext>().As<PonosContext>().InstancePerHttpRequest();
//Example repo constructor
public MessageRepository(PonosContext context)
{
_db = context;
}
当您使用IoC容器时,您不应该调用容器管理的服务的new。在这个例子中,你不应该使用:
using(var context = new MyContext())
_messageRepo = new MessageRepository(context);
_idRepo = new IdentityRepository(context);
您的依赖项应该被注入(例如通过构造函数)。
如何在AutoFac中注册您的存储库?也许您将存储库配置为singleton?当存储库被重新用于第二个http请求时,这可能会导致dispose异常。
DataContexts不应存在太长时间:)应在接近其使用情况的情况下创建和处理它们。
请考虑不要在不同的存储库之间传递相同的实例。如果您想在单个事务中封装多个操作,请查看TransactionScope