2016-07-30 55 views
1

忽略實體框架中的DbContext現在是工作單元的事實。 我想知道我可以如何簡化在類UnitOfWork中創建存儲庫,因爲現在每次創建新的存儲庫類時都必須將該屬性添加到該類中?我不想要通用存儲庫類。如何簡化在UnitOfWork類中創建存儲庫?

public class UnitOfWork 
    { 
     private SchoolContext _context = new SchoolContext(); 

     private IDepartmentRepository _departmentRepository; 
     private ICourseRepository _courseRepository; 

     public IDepartmentRepository DepartmentRepository 
     { 
      get 
      { 

       if (this._departmentRepository == null) 
       { 
        this._departmentRepository = new DepartmentRepository(_context); 
       } 
       return _departmentRepository; 
      } 
     } 

     public ICourseRepository CourseRepository 
     { 
      get 
      { 

       if (this._courseRepository == null) 
       { 
        this._courseRepository = new CourseRepository(_context); 
       } 
       return _courseRepository; 
      } 
     } 

     public void Save() 
     { 
      _context.SaveChanges(); 
     } 

    } 

回答

1

這是你的架構,所以你是負責爲你的存儲庫類型提供屬性的人。目前正在簡化代碼的幾種方法:

  1. 有寫你的屬性更短的方式:

    ICourseRepository _courseRepository; 
    public ICourseRepository CourseRepository => 
        _courseRepository ?? (_courseRepository = new CourseRepository(_context)); 
    

    這將是更長一點與C#5或更低(你需要顯式獲取訪問者)。您也可以使用Lazy<T>類型。

  2. 依賴注入。你的getter看起來就像這樣:

    _someDI.Get<ICourseRepository>(new Parameter(_context)); 
    

    你需要先註冊你的類型是這樣的:

    _someDI.Register<ICourseRepository, CourseRepository>(); 
    

    或各類在一起:

    _someDI.RegisterAllImplementingInterface<IBaseRepository>().AsImplementingInterfaces(); 
    

    它也會讓使用單一方法可能,但類型將不易發現:

    TRep GetRepository<TRep>() where TRep : IBaseRepository => 
        _someDI.Get<TRep>(new Parameter(_context)); 
    
  3. 使用T4生成代碼。您可以閱讀項目文件以獲取類型列表,然後根據該信息生成屬性。 (可能)當C#7變得可用時,內置於其中的代碼生成器。它是否可用,以及什麼將被包含仍然待定。