加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-16 06:38:15 所属栏目:asp.Net 来源:网络整理
导读:我正在使用实体框架的ASP.NET Web窗体应用程序,我想知道我应该如何处理ObjectContext并且它的生命周期. 例如,我有一个InviteService类来管理邀请,例如创建和接受邀请.该类本身位于Web项目的另一个项目/命名空间中. InviteUsers()方法为用户列表创建Invite实
我正在使用实体框架的ASP.NET Web窗体应用程序,我想知道我应该如何处理ObjectContext并且它的生命周期.
例如,我有一个InviteService类来管理邀请,例如创建和接受邀请.该类本身位于Web项目的另一个项目/命名空间中.
InviteUsers()方法为用户列表创建Invite实体,调用存储库以将其保存到数据库并向每个用户邮寄邀请链接.

当用户单击“邀请”按钮时,将从“页面”调用该方法.

我想知道如何使用ObjectContext

>在每个Request上的Page上实例化一个新的ObjectContext,将其作为参数传递给InviteService类的构造函数,然后将其置于Render方法中.
>与上面相同,但不是通过构造函数设置它,而是将它作为参数传递给每个方法.
>使用using块在每个方法中创建单独的Objectcontext.

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

解决方法

每个Web请求创建一个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;
}

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

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

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

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

另请参阅this Stackoverflow question,其中讨论了在IObjectContextFactory之间进行选择或每个请求都有一个ObjectContext.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读