将单个dbcontext用于服务层的工作单元
我试图与存储库层一起实现业务层(服务层)。所以我的项目有以下几层EF < ---存储库< ---服务< ---控制器< ---查看。将单个dbcontext用于服务层的工作单元
我的上下文类的样子:
public class ToDoContext : DbContext
{
public ToDoContext()
: base("ToDoContext")
{
}
public virtual DbSet<Project> Projects { get; set; }
public virtual DbSet <Collaborator> Collaborators { get; set; }
public virtual DbSet<ActionTask> Tasks { get; set; }
}
我ProjectRepository样子:
public class ProjectRepository : IProjectRepository, IDisposable
{
ToDoContext Context;
public ProjectRepository(ToDoContext context)
{
this.Context = context;
}
public virtual List<Project> AllProjects()
{
IQueryable<Project> projects = Context.Projects;
return projects.ToList<Project>();
}
public Project Find(int? id)
{
// some code
}
public void InsertOrUpdate(Project project)
{
// some code
}
public void Delete(int? id)
{
// some code
}
public void Save()
{
// some code
}
public void Dispose()
{
Context.Dispose();
}
}
我ProjectService类的样子:
public class ProjectService : IProjectService
{
IProjectRepository ProjectRepo;
ICollaboratorRepository CollaboratorRepo;
public ProjectService(IProjectRepository projectRepo, ICollaboratorRepository collaboratorRepo)
{
this.ProjectRepo = projectRepo;
this.CollaboratorRepo = collaboratorRepo;
}
public List<Project> GetAllProjects()
{
return ProjectRepo.AllProjects();
}
public void CreateProject(FormCollection formData)
{
// code to parse form data as per my business needs
// code to code to fetch related collaborator list
// save the project data
}
public List<Collaborator> GetCollaborators(string[] collaboratorId)
{
// Fetch collaborator list using collaborator repository
return CollaboratorRepository.GetAllCollaborators();
}
}
同样地,我已经实现了服务和存储库层为我的合作者。
总结代码我的createProject()使用合作者库中ProjectService类方法获取合作者名单,并创建一个新的项目,这个新创建的项目安装合作者名单,并保存it.So我想对我来说这整个过程是一个工作单位。
当我取使用CollaboratorRepository合作者的名单,并尽量节省使用ProjectRepository新创建的项目,它引发了我的错误“一个实体对象不能被IEntityChangeTracker。的多个实例引用”。我想这是因为CollaboratorRepository dbcontext尚未处理。所以我在使用新的上下文之前手动处理每个上下文。我知道我无法承担手动处理上下文的开销。任何人都可以帮助我吗?
我知道我应该为一个工作单元使用相同的dbcontext对象。但是,当dbcontext对象暴露于存储库而不是服务层时,我不知道如何实现这一点。
如何配置IoC?您应该为每个请求\线程注册DbContext的生存期,以便根据商业交易获得相同的实例。
提示:为了在Web环境之外拥有可重用的服务,请勿将FormCollection传递给CreateProject方法。 FormCollection的解析应该由controller \ model联编程序完成。
对于Ninject,尝试InRequestScope
kernel.Bind<ToDoContext>().To<ToDoContext>().InRequestScope();
你在哪里初始化ToDoContext ..您是否使用DI还是什么? –
是的,我正在使用DI(Ninject)。 – amanraj
你可以分享它,你如何使用它,因为我认为问题将在 –