Фабричный метод static
может быть трудно смоделировать для модульного тестирования.Так, например, в вашем контроллере, если бы у вас было:
public void SomeControllerMethod()
{
var entities = EntityFactory.GetEntity();
return entities.Something // ... get whatever data...
}
Тогда как бы вы использовали фиктивный контекст данных в модульном тесте?Это было бы сложно сделать.Было бы лучше «внедрить» ваш контекст в ваш контроллер, обычно через конструктор (прочитайте статью в Википедии о « принцип инверсии зависимостей », если вы не знакомы с концепцией), например:
public class SomeController
{
private readonly IDBEntities entities;
// db context passed in through constructor,
// to decouple the controller from the backing implementation.
public void SomeController(IDBEntities entities)
{
this.entities = entities;
}
}
И затем использовать методы контроллеров, которые передаются в ссылке.Таким образом, вы можете использовать инструмент внедрения зависимостей, чтобы получить соответствующий контекст БД, или передать имитируемый контекст.
Я не уверен, что у MVC2 был хороший способ добавить инфраструктуру внедрения зависимостей, но язнаю, что MVC3 делает.
Ваш подход тоже работает, в этом нет ничего принципиально неправильного, его просто сложнее проверить.Конечно, если вы не проводите модульное тестирование и вам не нужно использовать фиктивное хранилище данных, то, я думаю, это действительно не имеет значения:)
Я обычно заканчиваю тем, что использую MVC3 с EntityFramework Code-Во-первых, что довольно неплохо, и вы можете смоделировать большую часть слоя данных с помощью List<T>
вместо реальной базы данных, вы можете «загружать» и «сохранять» записи в списках в памяти и никогда не трогать реальную базу данных.