2013-06-28 2 views
0

Сегодня утром я обсуждал возможные пути использования логики локализации, которая будет выполнять локализацию наших моделей.«Чистое» потребление логики локализации в ASP.NET MVC

Вопрос в том, что было бы более чистой реализацией для потребления логики локализации?

Вариант 1: Использование АОП Style Filter на контроллере Действие

[LocalizeModel] 
    public ActionResult Index() 
    { 
     Menu menu = _menuRepository.GetMenu(MENU_TYPE); 

     return PartialView("Index", menu); 
    } 

Где LocalizeModel Атрибут перехватит возвращаемого значения, а также выполнять локализацию модели на основе ее типа (с учетом его реализует данный интерфейс).

Вариант 2: Расход через Dependency Injection

public MenuController(IMenuRepository menuRepository, ILocalizeMenus menuLocalization) 
    { 
     _menuRepository = menuRepository; 
     _menuLocalization = menuLocalization; 
    } 

    public ActionResult Index() 
    { 
     Menu menu = _menuRepository.GetMenu(MENU_TYPE); 

     _menuLocalization.LocalizeAllText(menu); 

     return PartialView("Index", menu); 
    } 

Другой вариант?

+0

Использование декоратора (в принятом ответе) было моим выбором, мне понравилось, как он уменьшил зависимостей между контроллерами, а также скрыл множественные вызовы в MenuRepository (который, по общему признанию, не является репозиторием по моему определению шаблона). – holsee

ответ

1

Вы можете создать декоратор над IMenuRepository menuRepository, который будет делать локализацию при вызове _menuRepository.GetMenu (MENU_TYPE), код будет выглядеть примерно так:

public class LocalizerDecorator : IMenuRepository menuRepository 
{ 

    private IMenuRepository originalRepository; 
    private ILocalizeMenus menuLocalization; 


    public LocalizerDecorator(IMenuRepository originalRepository, ILocalizeMenus menuLocalization) 
    { 
     this.originalRepository = originalRepository; 
     this.menuLocalization = menuLocalization; 
    } 

    public Menu GetMenu(string MENU_TYPE) 
    { 
     var result = this.originalRepository.GetMenu(TYPE); 
     this.menuLocalization.LocalizeAllText(result); 
     return result; 
    } 

} 

Затем вам нужно настроить вам DI использовать ваш декоратор, а не реальный репозиторий