Важным аспектом проектирования является слабая связь между различными уровнями вашего приложения. Эта слабая связь может быть достигнута путем введения интерфейсов и абстрактных классов. Таким образом, различные слои приложения не сильно связаны.
Более слабая связь облегчает моделирование этих зависимостей в модульном тесте, так что вы никогда не зависите, например, от вызова базы данных.
Итак, давайте возьмем в качестве примера следующий интерфейс:
public interface IProductsRepository
{
Product Get(int productId);
void Save(Product product);
}
Теперь у вас может быть сервисный слой, который будет зависеть от этого хранилища:
public class ProductsService
{
private readonly IProductsRepository _repository;
public ProductsService(IProductsRepository repository)
{
_repository = repository;
}
public void SomeBusinessOperation(int productId)
{
var product = _repository.Get(productId);
// TODO: update some properties of the product
_repository.Save(product);
}
}
Как видите, класс обслуживания теперь слабо связан с хранилищем. Тогда вы могли бы очень легко провести его модульное тестирование в изоляции. Просто выберите макет фреймворка, такой как Rhino Mocks , и в своем модульном тесте создайте импровизированную реализацию репозитория, которая будет передана конструктору сервисов, и сможете протестировать бизнес-операцию в изоляции любой базы данных.