gpt4 book ai didi

asp.net - 在 ASP.NET 中管理 Entity Framework ObjectContext

转载 作者:行者123 更新时间:2023-12-04 23:28:21 28 4
gpt4 key购买 nike

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

Page 调用该方法当用户点击邀请按钮时。

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

  • 实例化一个新的 ObjectContext在每个请求的页面上,将其作为参数传递给 InviteService 的构造函数类,然后将其丢弃在 Render 中方法。
  • 与上面相同,但不是通过构造函数设置它,而是将其作为参数传递给每个方法。
  • 创建一个单独的Objectcontext在每种方法中使用 using堵塞。

  • 根据 Ladislav 的回答,选项一在我看来是最好的: Entity Framework and Connection Pooling
    但是选项 3 似乎也有效,因为据我所知,由于连接池,没有建立新的数据库连接。

    最佳答案

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

    由于您已经在谈论在服务的构造函数中注入(inject)上下文,因此请看一下依赖注入(inject)(如果您还没有使用它)。当您使用依赖注入(inject)容器时,您可以让容器为您创建该服务并在该容器中注入(inject)对象上下文。您的页面唯一要做的就是从容器中请求该服务(理想情况下,您甚至可以将该服务注入(inject)该页面的构造函数中,但这对于 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)中,您可以像这样配置依赖注入(inject)框架:
    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;
    }

    在这些示例中,我使用了 Simple Injector依赖注入(inject)容器,尽管任何 DI 容器都可以。 RegisterPerWebRequest不是核心库的一部分,而是 is available as (NuGet) extension package .该软件包可确保您的 ObjectContext当 Web 请求结束时释放。

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

    此外,将执行用例的逻辑放在一个类中:一个命令。让命令(或系统)确保该操作的原子性。不要让页面对此负责,也不要在请求结束时提交,因为那时您将不知道调用 commit 是否可以。不,让命令自己处理。这里是 an article about writing business commands .

    这个建议也适用于 ASP.NET MVC,虽然你不应该调用 Global.GetInstance<IMyService>()在 Controller 的构造函数中,但只需使用构造函数注入(inject)(因为 MVC 对此有很好的支持)并使用 MVC3 Integration package .

    也看看 this Stackoverflow question ,其中谈到在 IObjectContextFactory 之间进行选择或拥有 ObjectContext每个请求。

    关于asp.net - 在 ASP.NET 中管理 Entity Framework ObjectContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8927779/

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