2016-09-30 2 views
1

У меня есть эта логика несколькими способами в моем проекте MVC5. Он работает, но я повторяю себя довольно последовательно.Принцип DRY с методами контроллера

private PersonnelManagementEntities db = new PersonnelManagementEntities(); 
     private ActiveDirectoryTools adt = new ActiveDirectoryTools(); 
     private ManagerService ms = new ManagerService(); 
     private UserService us = new UserService(); 
     private CompanyService cs = new CompanyService(); 

public ActionResult CompanySummary(int id = 0) 
     { 
      //Repeating logic begins here 
      int setID = 0; 
      adt.GetUserInfo(User.Identity.Name); 
      //Fetch current users company 
      User currentUser = us.getUser(adt.adUserName); 
      //Determine if user is a global manager or not. If global display all companies 
      ViewBag.Company = cs.FetchCompanies(currentUser); 
      //You can only see the companies you're assigned to, in the AllRequests window. Unless manually overwritten in the URL 
      if (currentUser.GlobalUser == true && id > 0) 
      { 
       setID = id; 
      } 
      else 
      { 
       setID = (int)currentUser.CompanyID; 
      } 
      //End of repeating logic 
      var resultSet = db.UserTimeSummaryUpdated(setID); 
      return View(resultSet.ToList()); 

     } 

Что вы, ребята, думаете, было бы лучшим способом уменьшить количество повторений?

Вы можете увидеть здесь в другом методе, где я повторно использовать этот код:

public ActionResult AllRequests(int id = 0) 
     { 
      int setID = 0; 
      adt.GetUserInfo(User.Identity.Name); 
      User currentUser = us.getUser(adt.adUserName); 
      ViewBag.Company = cs.FetchCompanies(currentUser); 

      //You can only see the companies you're assigned to, in the AllRequests window. Unless manually overwritten in the URL 
      if (id > 0) 
      { 
       setID = id; 
      } 
      else 
      { 
       setID = (int)currentUser.CompanyID; 
      } 

      ViewBag.EmployeeList = db.Users 
            .Where(x => x.disabled == false) 
            .Where(x => x.CompanyID == setID) 
            .OrderBy(x => x.FullName) 
            .ToList(); 

      IQueryable timeRequests = db.TimeRequests 
           .Include(t => t.ApproveDenyReason) 
           .Include(t => t.DayType) 
           .Include(t => t.User) 
           .Include(t => t.User1) 
           .Include(t => t.User2) 
           .OrderByDescending(t => t.sDateTime) 
           .Where(t => t.User.CompanyID == setID); 
      return View(timeRequests); 
     } 

Я думал о создании ActionFilter и делать это таким образом, но это, кажется, своего рода хак вместо правильного способа ведения вещи. Я также рассмотрел идею, когда пользователь входит в систему. Я создаю объект пользователя и сохраняю его через сеанс. Любая помощь с благодарностью

ответ

1

Один из вариантов - написать CustomController, который наследует контроллер. Я сделал это, чтобы добавить данные сеанса пользователя и систему вывода сообщений, которые могут писать в мой LayoutView. Для примера ниже я предполагал FetchCompanies возвращает список ...

public class CustomController : Controller 
{ 
    private ActiveDirectoryTools _adt = new ActiveDirectoryTools(); 
    private UserService _us = new UserService(); 
    private CompanyService _cs = new CompanyService(); 
    public List<Company> UserCompanies; 

    public ApplicationController() 
     : base() 
    { 
    _adt.GetUserInfo(User.Identity.Name); 
    User currentUser = _us.getUser(adt.adUserName); 
    UserCompanies = _cs.FetchCompanies(currentUser); 
    } 

} 

При создании контроллера наследовать от этого CustomController. Затем в вашем ActionResult просто установите с помощью UserCompanies.

public AccountController:CustomController 
{ 
    public ActionResult Index() 
    { 
     ViewBag.Company = UserCompanies; 
     return View(); 
    } 
} 
Смежные вопросы