Mvc4:N层架构

5
工具:Mvc4,Sql server,Nhibernate 我正在学习Ntier架构,并计划通过一个小例子来学习。这将是一个学生注册应用程序,其中将有一个表格用于: a.名字 b.姓氏 c.地址 d.学生ID 该应用程序将能够: a.根据ID获取学生 b.获取所有学生 c.注册新学生/保存学生 d.编辑学生 e.删除学生
我计划拥有以下层次结构:
表示层(单独的项目mvc 4应用程序)
--- 学生表单的HTML在此处。 我可以在此处使用jquery等 ---我的控制器将调用服务
服务层(单独的项目:类库项目。 在这种情况下,只有Web将是我的客户端。 我将在另一个项目中学习使用WebAPI或WCF)
--- StudentService在此处
--- IstudentService在此处
业务层:(单独的项目:类库项目) ??
数据层:(单独的项目:类库项目) ??
数据库:(SQL Server数据库)
现在我感到困惑,我的问题是:
1.我将在哪一层创建我的学生模型(哪一层?) 2.对于我所拥有的学生示例,我将在我的业务层中编写什么内容。 3.我的数据层会有什么? 我将编写哪些方法? 它们是直接与数据库通信的方法吗?
以下是示例代码:
public interface IStudentService

    {
        IEnumerable<Student> GetStudents();

        Student GetStudentById(int id);

        void CreateStudent(Student student);

        void UpdateStudent(Student student);

        void DeleteStudent(int id);

        void SaveStudent();
    }

public class StudentService : IStudentService
    {
        private DataContext _datacontext;
        public StudentService()
        {
            _datacontext = new DataContext();
        }

        public IEnumerable<Student> GetStudents()
        {
            var students = _datacontext.Students;
            return students;
        }

        public Student GetStudentById(int id)
        {
            return _datacontext.Students.Find(id);
        }

        public void CreateStudent(Student student)
        {
            _datacontext.Students.Add(student);
            _datacontext.SaveChanges();
        }

        public void UpdateStudent(Student student)
        {
            _datacontext.Entry(student).State = EntityState.Modified;
            //_datacontext.Entry(student).State = EntityState.Modified;
            _datacontext.SaveChanges();
        }

        public void DeleteStudent(int id)
        {
            var student = _datacontext.Students.Find(id);
            _datacontext.Entry(student).State = EntityState.Deleted;
            _datacontext.SaveChanges();
        }

        public void SaveStudent()
        {
            _datacontext.SaveChanges();
        }
    }
2个回答

2
  1. 您在数据层中创建您的模型。您还将在显示层中创建模型(用于视图模型)。通常,在控制器中会进行数据模型和显示模型之间的某种映射。

  2. 简单的应用程序通常不需要业务层。特别是如果您的应用程序只是将表单中的数据保存到表格中。但是,在这样的应用程序中,您可能会执行一些操作,例如“除非您已经完成了那门课程,否则无法注册此类”,或者您可能会有“您已经注册了比允许的更多的课程”等等。这些都是必须在某个地方执行的业务规则,通常在业务层中执行。

  3. 您的数据层可能只是您的Entity Framework模型。这只是将您的模型加载并保存到数据库的代码。

有许多IoC容器..我喜欢Ninject,但其他人可能喜欢其他容器..这通常是个人喜好问题。

以上是在简单应用程序中执行的方式。在更复杂的应用程序中,您可能还有一个业务层中的模型。这完全取决于您的应用程序的复杂性,以及您是否需要在业务级别上以不同于数据模型级别的方式表示您的数据。

例如,您可能在业务层中有一个业务对象列表,但出于性能原因,这些对象在您的数据层中表示方式不同。但是,所有这些都不是您现在应该担心的事情。只需了解随着应用程序变得更加复杂,您可能需要以不同的方式执行操作。


1
你需要查看Onion Architecture。它在MVC版本方面有点过时,但层次结构非常分明。
就IoC容器而言,我建议看看Autofac——易于使用,具有许多功能,例如按约定注册和多租户。
至于你的问题:
通常情况下,表单提交后,控制器会收到一个提交的StudentViewModel,然后我会将其转换为Student对象并交给注入到控制器中的IStudentRepositoryIStudentRepositry将保存到DBContext中。存储库接口位于Domain层中,但存储库的实现位于Data层中。DI容器将匹配其中的一个。
这里的技巧是将所有接口放在领域层中,实现则应该坐落在它们应该在的地方。领域层不应该依赖于任何其他层(即领域项目不会引用数据和Web项目)。但是Web将依赖于数据和领域层。您只需要在Web层中使用Data层依赖项来配置IoC容器,因为Web层是您的聚合根,并且IoC应该在那里配置。但是,在任何操作中都不应直接使用Data对象,而应该注入存储库或服务的接口。
关于分层架构已经有很多讨论了,所以首先从洋葱架构开始,然后您将更好地了解自己需要什么。

我不确定洋葱架构对于刚开始学习的人来说是否是一个好东西,因为各种文章往往假定了很多知识。我认为,在完成传统的分层3层之后,OA是一个不错的“第二步”。 - Erik Funkenbusch
提到了IoC容器,所以我假定读者有一定的知识。我记得我自己也学过这些东西。我曾经在一个“传统”的3层应用程序中搞砸了,但当我尝试使用OA时,一切都落到了正确的位置,并且一切都很顺利。 - trailmax
1
是的,但事实上,你从“正确的混乱”中学到了很多东西,这使得OA对你来说变得有意义。如果你没有学习OA解决的问题,我觉得OA就像是很多“因为我这么说所以你就要这样做”。 - Erik Funkenbusch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接