gpt4 book ai didi

c# - 如何处置我的 DbContext?

转载 作者:行者123 更新时间:2023-11-30 17:13:47 24 4
gpt4 key购买 nike

我在将单一的 ASP.NET MVC 应用程序拆分为 N 层应用程序时遇到了很大的困难。在下面的示例中,在第一次调用 _messageRepo.Create() 时抛出一个异常,指出 DbContext 已被处置,因此无法使用。

我看不出这是怎么回事,尝试中断 Dispose() 方法实际上不会导致应用程序在调试期间中断。

基本结构如下:

  • Controller 注入(inject)了它们使用的每个服务的实例//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 单行代码,使用代码优先方法通过 Entity Framework 从数据库中检索模型。

这种方法有问题吗?一开始我确实让 MyContext 实现了 IUnitOfWork,但我删除了它,直到我使这个不那么复杂的方法起作用。

此外,我正在使用 IoC 框架 (AutoFac) 来加载这些接口(interface)实现的实例。如果这是问题所在,那么我需要更改我的逻辑以适应 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);

您的依赖项应该被注入(inject)(例如通过构造函数)。

您如何使用 AutoFac 注册您的存储库?也许您将存储库配置为单例?当存储库被重新用于第二个 http 请求时,这可能会导致处置异常。

关于c# - 如何处置我的 DbContext?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9484913/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com