Мы изучаем создание нового проекта и хотим исследовать его с использованием шаблонов уровня репозитория и сервиса, целью которого является создание слабосвязанного кода, который полностью тестируется с использованием ложных репозиториев.C# Service Layer Design Pattern
См. Ниже основную идею архитектуры. Мы будем использовать интерфейсы для описания репозиториев и внедрить их в уровни обслуживания, чтобы удалить любые зависимости. Затем, используя autofac, мы подключим службы во время выполнения.
public interface IOrderRepository
{
IQueryable<Order> GetAll();
}
public class OrderRepository : IOrderRepository
{
public IQueryable<Order> GetAll()
{
return new List<Order>().AsQueryable();
}
}
public class OrderService
{
private readonly IOrderRepository _orderRepository;
public OrderService(IOrderRepository orderRepository)
{
_orderRepository = orderRepository;
}
public IQueryable<Order> GetAll()
{
return _orderRepository.GetAll();
}
}
public class EmailService
{
public void SendEmails()
{
// How do I call the GetAll method from the order serivce
// I need to inject into the orderService the repository to use
}
}
Есть несколько вопросов, с которыми у нас возникают проблемы с поиском наилучшего пути вперед.
1) Если служба воспроизводит методы CRUD, как представляется, мы можем воспроизводить код без реальной выгоды. Или должен ли пользовательский интерфейс напрямую обращаться к репозиториям?
2) Что происходит, когда услуге необходимо вызвать другую услугу. В нашем примере выше, если служба электронной почты должна получить все заказы, добавим ли мы службу заказа в службу электронной почты?
Надеется, что это имеет смысл
Email службы не должна быть в курсе таких услуг, как OrderService, вам нужен Посредник работать с обеими службами электронной почты && заказа, так что они будут развязаны – sll
Что делает ваш сервис заказа делать? Просто инкапсулируйте OrderRepository? Или он делает больше, чем это, из внешнего вида вашего кода это просто похоже на избыточный уровень. – gideon
Я задал бы другой вопрос. Хорошо ли выставлять IQueryable за пределами границы хранилища? Для меня нет. Это непрозрачная абстракция. –