2012-08-07 15 views
5

Witam, jestem nowy w strukturze repozytorium. Chciałbym uzyskać opinię na temat podejścia, które podążam.Wzór repozytorium dla zwykłych przedmiotów

Wymagania:. Budowanie menu dla użytkownika, który jest aktualnie zalogowany w

Moje rozwiązanie:

  1. I stworzył usługę, która zostanie wywołana przez kontrolera, aby uzyskać pozycje menu.

    public interface IApplicationHelperService 
    { 
        List<Menu> GetMenuForRoles(); 
    } 
    
  2. Implementacja usługi

    public class ApplicationHelperService : IApplicationHelperService 
    { 
        private readonly IMenuRepository _menuRepository; //this fecthes the entire menu from the datastore 
        private readonly ICommonService _commonService; //this is a Service that contained common items eg. UserDetails, ApplicationName etc. 
    
        public ApplicationHelperService(IMenuRepository menuRepository,ICommonService commonService) 
        { 
         this._menuRepository = menuRepository; 
         this._commonService = commonService; 
        } 
    
        public List<Menu> ApplicationMenu 
        { 
         get 
         { 
          return _menuRepository.GetMenu(_commonService.ApplicationName); 
         } 
        } 
    
        List<Menu> IApplicationHelperService.GetMenuForRoles() 
        { 
         return ApplicationMenu.Where(p => p.ParentID == null &&  p.IsInRole(_commonService.CurrentUser.Roles)).OrderBy(p => p.MenuOrder).ToList(); 
        } 
    
    } 
    
  3. wtedy CommonService (używany do wspólnych elementów potrzebnych w Usług np. CurrentUser

    public interface ICommonService 
    { 
        IUser CurrentUser { get; } 
        string ApplicationName { get; } 
    } 
    

W klasie implementuje ICommonService, otrzymuję bieżącego użytkownika za pomocą kontekstu, w innym wor ds moja warstwa usług nie wie o HttpContext, ponieważ istnieje możliwość, że może to być użyte do innego typu aplikacji w przyszłości. W ten sposób mogę obsłużyć bieżącego użytkownika inaczej dla wszystkich aplikacji, ale moja Warstwa Usług nie będzie miała nic przeciwko.

To, co powinieneś przekazać swoją opinię, brzmi: czy to podejście do wprowadzania tego rodzaju wspólnej usługi do wszystkich usług jest dobrym podejściem, czy jest inny sposób robienia tego, powód, dla którego pytam, jest na późniejszym etapie. potrzebować szczegółów bieżącego użytkownika do celów audytu lub z jakiegokolwiek powodu sam się przedstawia.

Mam nadzieję, że to ma sens dla kogoś. :-)

Odpowiedz

1

Używamy podobnego podejścia. Różnica polega na tym, że nie mamy obiektu CommonService wstrzykiwanego do każdej usługi.

Używamy WCF i napisaliśmy rozszerzenie do OperationContext do przechowywania nazwy użytkownika itp. Do właściwości zdefiniowanych w tym rozszerzeniu można uzyskać dostęp za pomocą statycznych wywołań metod. Ma przewagę nad implementacją CommonService; ponieważ używasz IOC, nie ma bezpośredniego sposobu przekazywania parametrów do usługi CommonService w każdym wywołaniu usługi. Na przykład, jeśli wysyłasz nazwę użytkownika podczas wywołań WCF, musisz ustawić wartość CurrentUser w każdym konstruktorze.

Nie wiem, czy planujesz użyć WCF; ale chodzi o to, że: jeśli potrzebujesz przekazać zmienne do swojej usługi CommonService, uzyskasz wypełnienie tych wartości wewnątrz każdego konstruktora. Jeśli nie planujesz przekazywać zmiennych, możesz po prostu utworzyć klasę podstawową dla swoich usług i zmusić programistów do korzystania z tej klasy bazowej.

Należy również ustawić menedżer czasu istnienia usługi CommonService jako UnityPerResolveLifeTimeManager, aby nie tworzyć nowej instancji w każdym konstruktorze. W przeciwnym razie może się zdarzyć, że wystąpią różne wystąpienia w każdej z usług.

+0

Wątpię, czy będziemy używać usługi WCF. O przejściu parametrów, wątpię, że powinno być tego potrzeba. Jest to bardziej podejście "klasy statycznej". Zajrzę jednak do klasy bazowej ... – Captain0

+0

Zapomniałem wspomnieć w odpowiedzi, ale jeśli kiedykolwiek zajdzie potrzeba rozwiązania więcej niż jednego repozytorium w klasie usług; być może będziesz musiał również użyć wzorca UnitOfWork, aby zapisać zmiany we wszystkich repozytoriach transakcji. – daryal

Powiązane problemy