Asp.Net MVC - общие данные для всех контроллеров - PullRequest
4 голосов
/ 25 января 2010

Настройка: (с использованием Asp.Net MVC 2 RC, Entity Framework, SQL Server, VS2008)

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

Ex. Данные для domain1.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. Есть ли лучший способ обработки нескольких доменов, нацеленных на один проект и фильтрации данных?
  2. Есть ли лучший способ иметь объект Website в каждом контроллере?

UPDATE

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

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

Ответы [ 2 ]

1 голос
/ 26 января 2010
1 голос
/ 25 января 2010

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

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

 public BaseController() : this(null) { }

 public BaseController( IWebsiteRepository websiteRepository )
 {
     this._websiteRepository = websiteRepository ?? new WebsiteRepository();
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...