在ASP.NET中管理实体框架ObjectContext
我正在使用实体框架的ASP.NET Web窗体应用程序,我想知道我应该如何处理ObjectContext并且它的生命周期.
例如,我有一个InviteService类来管理邀请,例如创建和接受邀请.该类本身位于Web项目的另一个项目/命名空间中. InviteUsers()方法为用户列表创建Invite实体,调用存储库以将其保存到数据库并向每个用户邮寄邀请链接. 当用户单击“邀请”按钮时,将从“页面”调用该方法. 我想知道如何使用ObjectContext >在每个Request上的Page上实例化一个新的ObjectContext,将其作为参数传递给InviteService类的构造函数,然后将其置于Render方法中. 根据Ladislav的答案,选项一对我来说似乎最好:Entity Framework and Connection Pooling 解决方法
每个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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc-3 – 是否可以在Javascript文件中使用razor语法
- ASP.NET Forms身份验证和持久身份验证Cookie安全性
- asp.net – 为什么ModalPopupExtender不通过javascript显示
- 如何清除代码背后的整个asp.net页面?
- ASP.NET MVC与Web客户端软件工厂(WCSF)
- asp.net – 当绑定值包含冒号时,如何绑定GridView HyperLin
- DxPackNet 1.打开摄像头
- asp.net-mvc-2 – Asp.net Mvc显示String的模板,但现在每个
- ASP.NET Repeater以及分页控件AspNetPager
- asp.net-mvc-4 – MVC4的DotNetOpenAuth TwitterClient示例
- asp.net – IIS 6如何从http://example.com/*重定
- asp.net-mvc – 在Asp.Net Core上传图片?
- asp.net-mvc – 使用数据注释验证ASP.NET MVC 2中
- asp.net-mvc – Asp.net Identity:User.Identit
- 如何从中等信任的ASP.NET中的bin文件夹加载文件
- .NET Standard项目构建失败,消息无用
- asp.net – 是否可以更改web.config而不会终止所
- ASP.NET MVC4代码优先 – ‘无法附加文件作为数据
- asp.net-mvc-3 – 存储库模式和Azure表存储(???)
- KCFinder for ASP.NET