Windsor教程中的服务层中的ISession / UnitofWork

时间:2011-04-25 21:02:25

标签: asp.net-mvc nhibernate castle-windsor

我正在尝试使用this tutorial构建一个真实世界的应用程序作为框架的基础。我理解MVC,但对整个IOC / NHibernate世界都是新手。在SO上阅读了几个Q& A后,我正在考虑在控制器和存储库之间添加一个服务层,因为我将在线下添加一些业务规则验证。

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)是从服务层传递到存储库,还是有另一种方法。

这是我到目前为止所拥有的:

// 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 个答案:

答案 0 :(得分:1)

为什么样本应用程序以这种方式实现是有原因的。嗯,实际上有两个原因。

第一个原因是它相对简单并且没有足够的逻辑来保证单独的层。

其次,这种控制器 - &gt;服务 - &gt;存储库 - &gt; ISession抽象毫无意义,并没有添加任何内容。他们所做的只是增加了应用程序的复杂性和你所做的工作量而没有任何好处。

Ayende有一个很好的,最近的一系列关于它的博客,我强烈推荐。 (here's the first of them,其次是其他几个)。

你有哪些现实世界的要求可以保证这两个额外的层?

最后,YAGNI和KISS。