2010-01-25 3 views
4

Установка: (с помощью Asp.Net MVC 2 RC, Entity Framework, SQL Server, VS2008)Asp.Net MVC - Общие данные по всем контроллерам

Мой приятель и я работаю над проектом, который будет иметь разные домены, указывающие на него. Мы хотим получить домен (веб-сайт) из Запроса и использовать его для управления данными. Данные веб-сайта должны быть частью всех контроллеров.

Ex. Данные для домена1.website.com будут быть разными, чем данные для домена domain2.website.com, и те будут , отличные от данных для website2.com. Внешний вид сайта тот же для все это, но данные разные.

Я установил BaseController, из которого все мои другие контроллеры унаследованы. Но мне это не нравится.

BaseController:

public class BaseController : Controller 
{ 
    private Website _website; 
    private readonly IWebsiteRepository _websiteRepository; 

    public BaseController(IWebsiteRepository websiteRepository) 
    { 
     _websiteRepository = websiteRepository; 
    } 

    public Website CurrentWebsite { get; } 
} 

Проблема в том, что я теперь должен пройти IWebsiteRepository к основанию каждого из моих контроллеров:

public class BioController : BaseController 
{ 
    private readonly IBiographyRepository _bioRepository; 

    public BioController(IBiographyRepository bioRepository, IWebsiteRepository websiteRepository) 
     : base(websiteRepository) 
    { 
     _bioRepository = bioRepository; 
    } 
} 

вот мои вопросы

  1. Есть ли лучший способ обработки нескольких доменов bei ng указал на один проект и фильтрацию данных?
  2. Есть ли лучший способ иметь объект Веб-сайта в каждом контроллере?

UPDATE

К сожалению, я забыл добавить, что в. Я уже использую IoC (структура карты). Мой вопрос больше о строках:

  1. Должен ли я заменить BaseController чем-то еще? ActionFilter?
  2. Есть ли способ настроить его, чтобы мне не пришлось передавать IWebsiteRepository базовому классу?
  3. Есть ли лучший способ обработки доменов, используемых для данных?

ответ

1

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

Одним из улучшений, которые я бы сделал, является создание конструктора по умолчанию для ваших контроллеров, который вызывает конструктор с параметрами с нулевыми значениями. В своем конструкторе с параметрами создайте экземпляр правильного репозитория, если заданный параметр равен нулю. Таким образом, вам не нужно внедрять фабрику контроллеров для создания контроллеров с их параметрами; фабрика контроллера по умолчанию может использовать конструкторы без параметров, и вы все равно получаете выгоду от впрыска конструктора.

public BaseController() : this(null) { } 

public BaseController(IWebsiteRepository websiteRepository) 
{ 
    this._websiteRepository = websiteRepository ?? new WebsiteRepository(); 
} 
Смежные вопросы