2016-04-19 3 views
2

Я копаю в том, как структурировать проекты, и поэтому я наткнулся на архитектуру лука. Насколько я понимаю, это скорее архитектура с центром в центре, а не тип базы данных.Зачем выставлять сервис вместо репозитория в архитектуре лука?

Я ищу некоторых GitHub проектов для изучения и узнать больше об архитектуре, так что я нашел один https://github.com/chetanvihite/OnionArchitecture.Sample

Я с трудом понимание времени:

namespace Domain.Interfaces 
{ 
    public interface IUserRepository 
    { 
     IEnumerable<User> GetUsers(); 
    } 
} 

namespace Services.Interfaces 
{ 
    public interface IUserService 
    { 
     IEnumerable<User> GetUsers(); 
    } 
} 

namespace Services 
{ 
    public class UserService : IUserService 
    { 
     private readonly IUserRepository _repository; 

     public UserService(IUserRepository repository) 
     { 
      _repository = repository; 
     } 

     public IEnumerable<User> GetUsers() 
     { 
      return _repository.GetUsers(); 
     } 
    } 
} 

Как он использует это путем инъекции конструктора.

private readonly IUserService _service; 

public HomeController(IUserService service) 
{ 
    _service = service; 
} 
  1. Вы всегда разоблачить такую ​​услугу, как IUserService в приложение, которое потребляет его? Но я заметил, IUserRepository аналогичен методу IUserService?

  2. Если вы говорите, что касается инфраструктуры, означает ли это или включает в себя базу данных? Или не обязательно? Если нет, то каковы примеры проблем инфраструктуры?

  3. Есть ли у вас рекомендации относительно бесплатных проектов/проектов github, которые я могу загрузить, чтобы узнать или изучить дальнейшую архитектуру лука? Я лучше понимаю на примерах

P.S. Поскольку я изучаю архитектуру лука, это всегда, если не всегда, по крайней мере, упоминание о DDD. Так что я думаю, что я буду учиться DDD также :)

+2

Очень хорошая статья о различных видах услуг в DDD, с некоторым кодом: http://gorodinski.com/blog/2012/04/14/services-in -domain-driven-design-ddd/ – guillaume31

ответ

6

1. Repository против службы:

Вы можете прочитать ответ на difference between repositories and services и/или Martin Fowlers service layer определение. В двух словах, репозиторий обрабатывает постоянство данных, тогда как служба предоставляет API-интерфейс, ориентированный на клиента, для бизнес-логики.

В данном небольшом примере выгоды могут быть неясными, но представьте, что у UserService были дополнительные методы, такие как lockUser(User user) или joinGroup(User user, Group group). Затем UserService использует любойIUserRepository реализация, чтобы фактически сохранить бизнес-логику.

2. Инфраструктура Касается

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

3. Примеры

Коллекция примеров, которые я знаю (отмечены *), а некоторые, что я только что найдено:

+0

Большое спасибо за ссылки. Действительно оценивайте это, но в 1. Это не значит, что мне придется создавать те же методы, как lockUser и joinGroup в репозитории, правильно? –

+0

Да, предположим, что 'IUserRepository' предоставляет простые методы CRUD для объекта пользователя. Метод 'UserService.lockUser (userToLock)' затем изменяет состояние пользовательского объекта (например, 'userToLock.lock()'), а затем сохраняет его с помощью репозитория (например, '_repository.save (userToLock)'). Инкапсуляция позволяет легко добавлять сквозные проблемы независимо от фактической реализации сохранения в UserService, например управление доступом, запуск событий, ведение журнала, ... –

Смежные вопросы