ISession / UnitofWork в сервисном слое в Windsor учебник - PullRequest
1 голос
/ 26 апреля 2011

Я пытаюсь создать реальное приложение, используя это руководство в качестве основы для фреймворка. Я понимаю MVC, но я новичок во всем мире IOC / NHibernate. Прочитав несколько вопросов и ответов здесь, в SO, я подумываю добавить слой Service между контроллером и хранилищем, так как я добавлю некоторые проверки бизнес-правил в будущем.

Источник на github также имеет 'ServiceInstaller', который оказался действительно полезным, так как позволяет мне добавлять любые приложения в приложение, т.е.

public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container.Register(AllTypes.FromThisAssembly().Pick()
                            .If(Component.IsInSameNamespaceAs<SectionService>())
                            .Configure(c => c.LifeStyle.Transient)
                            .WithService.DefaultInterface());
    }

Мой вопрос относится к этому учебнику, и в основном я не уверен, что ISession (который является UoW) передается со слоя Service в Репозиторий или есть другой подход.

Вот что у меня есть:

// Controller

    public class SectionsController : Controller
    {
        public ILogger Logger { get; set; }
        private readonly ISectionService sectionService;

        public SectionsController(ISectionService sectionService)
        {
            this.sectionService = sectionService;
        }

        public ActionResult Index()
        {
            return View(sectionService.FindAll());
        }

    // other action methods
    }

// Service Layer

    public class SectionService : ISectionService
    {
        private ISectionRepository repository;

        public SectionService(ISession session)
        {
            this.repository = new SectionRepository(session);
        }

        public IQueryable<Section> FindAll()
        {
            return repository.FindAll();
        }

    // other methods
    }

// Repository
    public class SectionRepository : ISectionRepository
    {
        private readonly ISession session;

        public SectionRepository(ISession session)
        {
            this.session = session;
        }

        public IQueryable<Section> FindAll()
        {
        return session.QueryOver<Section>().List().AsQueryable();
        }

    // other CRUD methods

    }

Это правильный способ реализовать это?

1 Ответ

1 голос
/ 26 апреля 2011

Существует причина, по которой пример приложения реализован таким образом.Ну, на самом деле две причины.

Первая причина, по которой он относительно прост и еще не достаточно логики для отдельного слоя.

Во-вторых, этот тип контроллера -> служба --> Репозиторий -> Абстракции ISession бессмысленны и ничего не добавляют в таблицу.Единственное, что они делают, это увеличивают сложность приложения и объем работы, которую вы делаете без пользы.

У Айенде есть хорошая, недавняя серия постов об этом, которую я очень рекомендую.( вот первый из них , за которым следует несколько других).

Какие у вас есть требования реального мира, которые оправдывают эти два дополнительных слоя?

Взакрытие, ЯГНИ и ПОЦЕЛУЙ.

...