UoW & Repository + Service Layer - PullRequest
       9

UoW & Repository + Service Layer

1 голос
/ 20 марта 2011

Я использую следующий T4 для создания своего репозитория и UoW: http://blogs.microsoft.co.il/blogs/gilf/archive/2010/07/05/repository-and-unit-of-work-t4-template-for-entity-framework.aspx

Теперь я пытаюсь добавить сервисный слой. Я смог сделать что-то вроде этого:

public ActionResult Index()
{
    using (DataEntities context = new DataEntities())
    {
        UnitOfWork uow = new UnitOfWork(context);

        //Service
        ClientService cli = new ClientService(uow);
        var col = cli.getActive();

        //Map results to ViewModel
        var list = AutoMapper.Mapper.Map<IEnumerable<Client>, IEnumerable<ClientListViewModel>>(col);

        return View(list);
    }
}

Это отлично работает, но ...

Правильно ли архитектурно передавать экземпляр UoW на уровень обслуживания?
(Я использую IUnitOfWork в его ctor)

Я пытался переместить контекст и UoW внутри уровня сервиса, но контекст не доступен, когда я пытаюсь отобразить результаты в ViewModel в контроллере.

Спасибо!

1 Ответ

1 голос
/ 17 мая 2011

Я бы сказал, что нет. Опять же, я не большой поклонник единицы работы - я чувствую, что она знает слишком много. Я бы передал необходимый репозиторий (-ы) в созданный вами сервис. Как правило, я получаю специальный «GetService» или «CreateService», но это может сработать для вас ... (я пишу это от руки, поэтому он может не собираться)

Public class DoSomethingCoolService : IDoSomethingCoolService
{

     private IRepository<SomethingINeed> _neededRepository;

     public DoSomethingCoolService(connectionOrContext)
     {
          //setup
     }

     public DoSomethingCoolService(IRepository<SomethingINeed> neededRepository)
     {
          _neededRepository = neededRepository;
     }

     public List<SomethingINeed> ReturnWhatIWant()
     {
          _neededRepository.Where(x => x.WhatIWant = true);
     }

}

Лично мне это не нравится. Я предпочитаю что-то более подобное ...

public interface IGetService<T>
{
    //usual get suspects here
}

public class GetService<T> : IGetService<T>
{
    private IRepository<T> _repository;
    GetService(IRepository<T> repository)

    //use repository to call gets
}

теперь для сложных вещей ...

public interface IGetClientService : IGetService<Client>
{
     List<Client> GetClientsForSomething(int someId);
}

public class GetClientService : GetService<Client>, IGetClientService
{
        private IRepository<Client> _repository;
        GetClientService(IRepository<Client> repository) : base(repository)

        public List<Client> GetClientsForSomething(int someId)
        {
              //some crazy cool business logic stuff here you want to test!
        }
}

Тогда внутри моего контроллера у меня просто есть зависимость от IGetClientService, и я использую его при необходимости. Легко тестировать, легко создавать другой, не зависящий от него.

Имеет ли это какой-то смысл?

...