2016-09-30 1 views
1

J'ai cette logique dans plusieurs méthodes dans mon projet MVC5. Cela fonctionne mais je me répète assez régulièrement.Principe DRY avec méthodes de contrôleur

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()); 

     } 

Selon vous, quel est le meilleur moyen de réduire le nombre de fois que je répète cela?

Vous pouvez voir ici une autre méthode où je réutiliser ce code:

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

Je pensais à la création d'un ActionFilter et de le faire de cette façon, mais il semble un peu un hack au lieu de la bonne façon de faire des choses. J'ai aussi eu l'idée de savoir quand un utilisateur se connecte, je crée un objet utilisateur et le persiste à travers une session. Toute aide est appréciée

Répondre

1

Une option consiste à écrire un CustomController qui hérite du contrôleur. Je l'ai fait pour ajouter des données de session de membre et un système de sortie de messagerie qui peut écrire sur ma LayoutView. Pour l'exemple ci-dessous, je supposais FetchCompanies retourne une liste ...

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

} 

Lorsque vous créez votre contrôleur héritent de cette CustomController. Ensuite, dans votre ActionResult, définissez simplement UserCompanies.

public AccountController:CustomController 
{ 
    public ActionResult Index() 
    { 
     ViewBag.Company = UserCompanies; 
     return View(); 
    } 
}