我有一个项目,我在其中使用NHibernate和ASP.Net MVC。该应用程序旨在允许用户跟踪某些数据,然后根据输入的数据生成统计数据视图。我的应用程序的结构到目前为止看起来是这样的:MVC /知识库模式 - 体系结构
NHibernate的层:包含Repository<T>
和UnitOfWork
类,以及实体映射定义。
核心/服务层:包含通用EntityService
类。目前,这只是通过IUnitOfWork
定义交易范围,并与IRepository
接口提供更高级别的数据访问服务。
表示层(MVC应用程序):尚未实现,但包含通常的东西加依赖注入。
我有几个问题:
它是设计不良,让我的MVC应用程序来处理依赖注入所有层?例如,除了将
EntityService
实例依赖注入到控制器中,它还会将IRepository
的依赖注入处理到EntityService
类中。服务层是否应该自己处理,即使这意味着在两个不同的地方执行依赖注入?我应该在哪里生成我的统计数据?这个业务逻辑似乎不属于我的服务层,它目前只包含实体类型定义和用于修改和访问实体属性的接口。我对此有几点想法,但我不确定我最喜欢哪一个:
- 保留我的服务层原样并创建一个单独的统计项目 - 这完全独立于它的实体类型这意味着我的MVC控制器必须在我的业务实体和我的(大概是静态的)统计类之间传递原始数字信息。这是相当整洁的分离,但可能意味着很多业务逻辑仍保留在表示层中。
- 创建一个统计项目;但是,请在此项目的类和我的业务实体之间建立紧密的耦合。例如,我将传递整个对象(或将它们定义为扩展方法),而不是将
Reading
对象的值传递给方法。这会将业务逻辑从我的MVC应用程序中移出,但紧密的耦合似乎有点混乱。 - 保留我所有的业务逻辑在我的服务层。定义
EntityService
的强类型子类,所以我的服务包含实体特定的业务方法和数据存储方法,同时将实体类本身保留为纯数据容器。为任何通用统计处理创建一个单独的统计项目,并通过派生的服务类调用其方法。我的服务类有效地将业务功能与由IRepository<T>
创建的存储功能合并。
我犯错朝着第三个选项,但没有任何人有什么想法?替代建议?
在此先感谢!
试着对第二个问题进行一点说明 - 我有一堆EntityService类,例如PersonService和ReadingService,它们将我的存储库暴露给我的应用程序。我的问题是现在如何最好地实现类来产生'Person.IList Readings'的各种统计信息 - 例如,是否更适合(作为一个简单的例子)'StatsService.AverageReadingFor(Person p,DateTime start,DateTime end)'在我的服务层中,或者只是在我的控制器里面使用Person.Readings.Where(e => e.DateRecorded ...)'并在那里平均它们? –
感谢您的建议,我已经实现了我的依赖注入并将我的NHibernate层重命名为DataAccess。 –
统计数据是业务逻辑(和功能需求)的一部分还是用于应用程序监控目的? –