Как я могу разделить логику действий между контроллерами относительно шаблона хранилища - PullRequest
1 голос
/ 22 октября 2010

У меня есть CompanyController и DepartmentController:

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");
   }
}

Вы можете видеть, что логика BatchDelete такая же, и я хочу, чтобы она была помещена в родительский контроллер, но есть проблема, хранилище. Я не могу позвонить в базовый репозиторий контроллера. GetList ().

Ответы [ 2 ]

2 голосов
/ 22 октября 2010

Вы должны иметь некоторую общность в вашем интерфейсе репозитория. Например, вы могли бы это сделать:

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");
   }
}

ОБНОВЛЕНИЕ Тогда ваш CompanyController будет выглядеть так:

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

Это поможет.

Еще одно предупреждение: похоже, ваш GetList () получает все объектов из базы данных и затем выбирает тот, который вы хотите удалить, для операции удаления. Лучше извлечь из базы данных только интересующую вас информацию и сохранить значительную производительность.

1 голос
/ 22 октября 2010

Именно поэтому, дети, мы передаем сервисы контроллерам, а не сырые репозитории.

...