在 ASP.NET 中管理实体框架 ObjectContext

2023-12-01

我正在将实体框架用于 ASP.NET Web 表单应用程序,我想知道应该如何处理ObjectContext这是一生。 例如,我有一个InviteService管理邀请的类,例如创建和接受邀请。该类本身位于 Web 项目的另一个项目/命名空间中。 一个InviteUsers()方法创建Invite用户列表的实体,调用存储库将它们保存到数据库中,并向每个用户发送邀请链接。

该方法是从Page当用户单击邀请按钮时。

我想知道我应该如何使用ObjectContext

  1. 实例化一个新的ObjectContext在每个请求的页面上,将其作为参数传递给构造函数InviteService类,然后将其放置在Render method.
  2. 与上面相同,但不是通过构造函数设置它,而是将其作为参数传递给每个方法。
  3. 创建一个单独的Objectcontext在每个方法中都有一个using block.

根据拉迪斯拉夫的回答,我认为选项一最好:实体框架和连接池但选项 3 似乎也有效,因为据我所知,由于连接池,没有建立新的数据库连接。


创建一个单一的并不罕见ObjectContext每个网络请求。我在我的网络应用程序中执行此操作。然而,IMO,该页面不应该知道ObjectContext.

由于您已经在讨论在服务的构造函数中注入上下文,因此请查看依赖项注入(如果您尚未使用它)。当您使用依赖项注入容器时,您可以让容器为您创建该服务并将对象上下文注入该容器中。您的页面唯一要做的就是从容器请求该服务(理想情况下,您甚至可以将该服务注入到该页面的构造函数中,但这对于 Web 表单来说是不可能的)。

您的页面将如下所示:

public class MyPage : Page
{
    private readonly IMyService service;

    public MyPage()
    {
        this.service = Global.GetInstance<IMyService>();
    }

    protected void Btn1_OnClick(object s, EventArgs e)
    {
        this.service.DoYourThing(this.TextBox1.Text);
    }
}

在应用程序的启动路径(Global.asax)中,您可以像这样配置依赖注入框架:

private static Container Container;

public static T GetInstance<T>() where T : class
{
    return container.GetInstance<T>();
}

void Application_Start(object sender, EventArgs e) 
{
    var container = new Container();

    string connectionString = ConfigurationManager
        .ConnectionStrings["MyCon"].ConnectionString;

    // Allow the container to resolve your context and
    // tell it to create a single instance per request.
    container.RegisterPerWebRequest<MyContext>(() =>
        new MyContext(connectionString));

    // Tell the container to return a new instance of
    // MyRealService every time a IMyService is requested.
    // When MyContext is a constructor argument, it will
    // be injected into MyRealService.
    container.Register<IMyService, MyRealService>();

    Container = container;
}

在这些例子中我使用了简易注射器依赖注入容器,尽管任何 DI 容器都可以。这RegisterPerWebRequest不是核心库的一部分,但是可作为 (NuGet) 扩展包使用。该套餐确保您的ObjectContext当网络请求结束时被处理。

乍一看这可能看起来很复杂,但这样网页就不必担心创建和处置的任何细节ObjectContext.

此外,将执行用例的逻辑放置在单个类中:命令。让命令(或系统)确保该操作的原子性。不要让页面对此负责,也不要在请求结束时提交,因为那时您将不知道是否可以调用提交。不,让命令自己处理这个问题。这是一篇关于编写业务命令的文章.

此建议也适用于 ASP.NET MVC,尽管您不应该调用Global.GetInstance<IMyService>()在 Controller 的构造函数内部,但只需使用构造函数注入(因为 MVC 对此有很好的支持)并使用MVC3集成包.

还看一下这个 Stackoverflow 问题,它讨论了之间的选择IObjectContextFactory或有一个ObjectContext根据要求。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 ASP.NET 中管理实体框架 ObjectContext 的相关文章

  • CngKey.Create 不支持请求的操作

    我正在尝试在 C 程序集中 以编程方式 动态生成自签名证书 目标 NET 4 0 作为根CA来生成其他证书 该证书不需要保留在 Windows 证书存储中 我会将其导出为文件 通读这个问题 https stackoverflow com q
  • 以编程方式添加超链接到列表项

    我想以编程方式获得以下 HTML ul li a href a li ul 我可以添加 li to ul But a to li 不可能 My code BulletedList ul new BulletedList ListItem l
  • Web API 帮助页面显示每个方法的两个版本

    如何避免帮助页面显示我的方法的两个版本 正如你所看到的 我已经设置了一条自定义路线 api property search finnId 但我不希望使用查询参数的那个出现在 帮助 页面中 有办法解决这个问题吗 我正在使用 ASP NET F
  • 排除以特定字符开头的正则表达式匹配

    我有以下内容 Regex urlRx new Regex https ftp file www A Za z0 9 A Za z0 9 RegexOptions IgnoreCase 这匹配所有 URL 但我想排除那些以字符开头的 URL
  • SQL LIKE 的 C# 版本

    有没有办法在 C 中搜索字符串中的模式 像 Sql LIKE 这样的东西会非常有用 正则表达式允许一切LIKE允许以及更多 但具有完全不同的语法 然而 由于规则LIKE是如此简单 其中 表示零个或多个字符 并且 表示一个字符 并且两者LIK
  • 为什么在 C# 中使用 1 元组 Tuple? [复制]

    这个问题在这里已经有答案了 我没有看到 C 中使用 1 元组 程序员为什么要使用它们 元组类 https msdn microsoft com en us library dd386941 28v vs 110 29 aspx 我看到过这样
  • 为什么 BLToolkit 没有更流行? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 获取 SSRS 的报告列表?

    我刚刚开始使用 SSRS 到目前为止 我已经能够通过对报告路径进行硬编码 使用 ReportViewer 在我的 Winforms 应用程序中显示报告 我想从 SSRS 获取一份报告列表 以便我可以显示它们并让用户选择他们想要查看的报告 有
  • HttpContext.Current.User.Principal 与 WindowsIdentity.GetCurrent()

    在打开 Windows 身份验证和身份模拟的 asp NET 环境中 HttpContext Current User Principal 和 WindowsIdentity GetCurrent 之间有什么区别 根据本论坛的Windows
  • End using 是否关闭打开的 SQL 连接

    如果我将 SQLConnection 包装在 using 中 我应该关闭它还是最终 using 处理它 using cn as new system data sqlclient sqlconnection cn open do a bun
  • 正则表达式替换多个组

    我想使用正则表达式将多个组替换为相应的替换字符串 更换表 gt amp gt hsh 1 gt 5 5 gt 6 例如 对于以下输入字符串 a1asda fj ahdk5adfls 对应的输出字符串是 a5asda ampfj hshahd
  • 为什么更新外键后引用约束会不一致?

    抱歉 这个模糊的标题很难用一句话来描述 我有 2 个实体User and UserAddress 其中 User 有 2 个外键DefaultInvoiceAddressId and DefaultDeliveryAddressId和 Us
  • 外部剃刀视图看不到外部模型

    我对外部剃刀视图有疑问 在我的项目中 我有主 mvc Web 程序集和动态加载的外部类库程序集 来自 DB 及其自己的控制器 视图和模型 这些程序集在运行时不会直接引用和加载 我能够通过为控制器创建自定义控制器工厂 为视图创建自定义虚拟路径
  • VS2010中VSHost.exe不断启动

    我正在 VS2010 中使用一个包含大量项目的解决方案 但它不断变得无响应 我注意到的一件事可能是一条线索 尽管我尚未开始任何调试 但 MyApplicationName vshost exe 不断出现在进程列表中 也许每当构建发生时它就会
  • ASP.NET 中的 thread.sleep

    我正在为我的网站模拟彗星实时馈送协议 因此在我的控制器中我添加 while nothing new before timeout Thread Sleep 1000 但我注意到添加此功能后整个网站变慢了 调试后我得出结论 当我打电话时Thr
  • 持续运行的 C# 代码 - 服务还是单独的线程?

    我有一个 NET 4 Web 应用程序 它有 3 个关联的独立项目 DAL BAL 和 UI 我正在使用实体框架进行数据库交互 我有代码循环遍历一堆数据库数据 根据找到的内容调用方法 然后更新数据库 我希望这段代码一直运行 同时 我希望用户
  • Excel 2007 中的数值 - 底层 xml 文件中的表示与存储

    这个问题与 NET和OpenXml有关 我已经阅读了以下文章 它有很好的解释 但没有回答我的问题 Excel 2007 中数值的可视化与底层 xml 文件不一致 https stackoverflow com questions 58594
  • 是否有理由为什么用 XmlInclude 修饰的基类在序列化时仍然会抛出类型未知的异常?

    我将简化代码以节省空间 但所提供的内容确实说明了核心问题 我有一个类 它的属性是基类型 有 3 个派生类可以分配给该属性 如果我将任何派生类分配给容器并尝试序列化容器 XmlSerializer 会抛出可怕的错误 类型 x 不是预期的 使用
  • 如何在 ASP.NET 3.5 中的 Web 内容页面设置页面标题

    我已经阅读了大量关于如何执行此操作的帖子 文章 但我仍然没有从内容页面获取页面标题集 我的页面呈现正常 但我无法从内容页面获取标题集 所有页面都根据母版页设置了标题 这是我的母版页的代码隐藏 Partial Class zSEO Inher
  • 使用实体框架实现 if-not-exists-insert,无需竞争条件

    使用 LINQ to Entities 4 0 是否有正确的模式或构造来安全地实现 如果不存在则插入 例如 我目前有一个跟踪 用户收藏夹 的表 用户可以在其收藏夹列表中添加或删除文章 基础表不是真正的多对多关系 而是跟踪一些附加信息 例如添

随机推荐