2016-12-30 85 views
0

我试图与存储库层一起实现业务层(服务层)。所以我的项目有以下几层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对象暴露于存储库而不是服务层时,我不知道如何实现这一点。

+0

你在哪里初始化ToDoContext ..您是否使用DI还是什么? –

+0

是的,我正在使用DI(Ninject)。 – amanraj

+0

你可以分享它,你如何使用它,因为我认为问题将在 –

回答

1

如何配置IoC?您应该为每个请求\线程注册DbContext的生存期,以便根据商业交易获得相同的实例。

提示:为了在Web环境之外拥有可重用的服务,请勿将FormCollection传递给CreateProject方法。 FormCollection的解析应该由controller \ model联编程序完成。

对于Ninject,尝试InRequestScope

kernel.Bind<ToDoContext>().To<ToDoContext>().InRequestScope();