在以下博客中:http://weblogs.asp.net/scottgu/archive/2010/07/16/code-first-development-with-entity-framework-4.aspx
该博客包含以下代码示例:
public class Dinner
{
public int DinnerID { get; set; }
public string Title { get; set; }
public DateTime EventDate { get; set; }
public string Address { get; set; }
public string HostedBy { get; set; }
public virtual ICollection<RSVP> RSVPs { get; set; }
}
public class RSVP
{
public int RsvpID { get; set; }
public int DinnerID { get; set; }
public string AttendeeEmail { get; set; }
public virtual …Run Code Online (Sandbox Code Playgroud) 我有一个相当标准的MVC 5应用程序,包括存储库层,服务层和控制器层.为了保持每个层分离和可测试,我使用Ninject进行依赖注入.
为了了解新技能,我决定在服务和控制器方法的IO绑定操作上使用async/await的新的新任务控制器操作.
通常我只是像这样使用InRequestScope绑定
kernel.Bind<IDbContext>().To<BlogContext>().InRequestScope();
Run Code Online (Sandbox Code Playgroud)
一般情况下这现在工作正常,但是如果我选择调试我的应用程序,或者将多个跟踪的实体框架对象连接在一起并保存,我发现上下文已被处理或我正在跟踪问题.我明白为什么会发生这种情况,这是完全合乎逻辑的,因为IIS线程上不再进行操作,所以Ninject如何知道它应该使用相同的上下文.
为了解决这个问题,我可以将我的上下文从我的服务层传递到每个存储库调用,如果需要,甚至可以从控制器层传递.但是我觉得这看起来很混乱,如果可能的话,我宁愿Ninject管理这个对象的上下文.
在保持我的代码类似于下面给出的示例的同时,以优雅/简约的方式处理此问题的最佳策略是什么?
这是我的一个控制器方法的示例
public virtual async Task<ActionResult> Edit(int id)
{
var editViewModel = await BuildDefaultCreateEditViewModel();
var post = await postService.GetNonDeletedPost(id);
...
...
return View(MVC.Admin.Post.Views.CreateEdit, editViewModel);
}
Run Code Online (Sandbox Code Playgroud)
服务方式
public async Task<PostDTO> GetNonDeletedPost(int postId)
{
return (await PostRepostiory.GetPost(postId)).ConvertToDTO();
}
Run Code Online (Sandbox Code Playgroud)
存储库方法
public Task<Post> GetPost(int postId)
{
return QueryableExtensions.SingleOrDefaultAsync(
DbSet.Where(post => post.PostId == postId)
.Include(post => post.PostVersions)
.Include(post => post.Categories)
.Include(post => post.Files));
}
Run Code Online (Sandbox Code Playgroud)