2016-12-30 73 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(); 
相關問題