代码之家  ›  专栏  ›  技术社区  ›  Eldar

如何在控制器之间就存储库模式共享相同的操作逻辑

  •  1
  • Eldar  · 技术社区  · 14 年前

    我有公司控制员和部门控制员:

    public class CompanyController : BaseBackendController
    {
       private ICompanyRepository repository;
       public CompanyController(ICompanyRepository repository)
       {
         this.repository = repository;
       }
    
      ...
       [HttpPost]
       public ActionResult BatchDelete(long[] ids)
       {
    
         var entities = repository.GetList().Where(item => ids.Contains(item.ID));
    
         repository.BatchDelete(entities);
         return RedirectToAction("Index");
       }
    }
    
    public class DepartmentController : BaseBackendController
    {
       private IDepartmentRepository repository;
       public DepartmentController(IDepartmentRepository repository)
       {
         this.repository = repository;
       }
    
      ...
       [HttpPost]
       public ActionResult BatchDelete(long[] ids)
       {
    
         var entities = repository.GetList().Where(item => ids.Contains(item.ID));
    
         repository.BatchDelete(entities);
         return RedirectToAction("Index");
       }
    }
    

    2 回复  |  直到 14 年前
        1
  •  2
  •   Steve Michelotti    14 年前

    您必须在存储库界面中具有一些通用性。例如,您可以这样做:

    public interface IRepository<T>
    {
        IEnumerable<T> GetList();
        void DeleteBatch(IEnumerable<T> entities);
        // other methods here
    }
    

    您的位置:

    public interface ICompanyRepository : IRepository<T>
    

    public interface IDepartmentRepository : IRepository<T>
    

    然后您可以如下设置基本控制器:

    public abstract class DataController<TModel> : Controller
    {
        protected IRepository<TModel> repository;
    
        public DataController(IRepository<TModel> repository)
        {
            this.repository = repository;
        }
    
       [HttpPost]
       public ActionResult BatchDelete(long[] ids)
       {
    
         var entities = repository.GetList().Where(item => ids.Contains(item.ID));
    
         repository.BatchDelete(entities);
         return RedirectToAction("Index");
       }
    }
    

    更新

    public CompanyController : DataController<Company>
    {
        public CompanyController(IRepository<Company> repository) : base(repository)
        {
        }
    }
    

    这就行了。

    另一个需要注意的是,GetList()看起来 从数据库中实体,然后选择要删除的实体进行删除操作。更好的检索 只有 从数据库中找到您感兴趣的那个并保存显著的性能。

        2
  •  1
  •   Wyatt Barnett    14 年前