Mvc4:N层架构

use*_*476 5 c# n-tier-architecture asp.net-mvc-4

工具:Mvc4,Sql server,Nhibernate

我正在学习Ntier架构,并计划用一个小例子来学习.这将是一个学生注册申请表,其中包含一份表格.名字b.姓氏c.地址d.学生ID该应用程序将能够.通过Id b获得学生.得到所有学生c.注册新生/保存学生d.编辑学生e.删除学生

我打算有以下几层

表示层(单独项目mvc 4应用程序)

---学生表格的html就在这里.我可以在这里使用jquery等 - 我的控制器将调用该服务

服务层(单独的项目:类库项目.在这种情况下,只有web将是我的客户端.我将学习稍后在另一个项目中使用webAPI或wcf)

---学生服务在这里

---这里是IstudentService

业务层:(单独项目:类库项目)??

数据层:(单独项目:类库项目)??

数据库:( sql server database)

现在我感到困惑,我的问题是:

  1. 我将在哪里创建我的学生模型(哪一层?)

  2. 对于这个学生的例子,我将在我的业务层写什么?

  3. 什么将进入我的数据层?我会写哪种方法?它们是直接与数据库通信的方法吗?

    一些例子会很棒.我会寻找一个好的IOC容器.

以下是示例代码:

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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

tra*_*max 1

你需要看看洋葱架构。就 MVC 版本而言,它有点过时了,但层次分得很清楚。

就 IoC 容器而言,我建议查看Autofac - 易于使用,具有很多功能,例如按约定注册和多租户。

至于你的问题:

我通常有的是在表单提交上,控制器会收到StudentViewModel提交的内容,然后我会将其转换为Student对象并移交给IStudentRepository注入到控制器中的对象。并将IStudentRepositry其保存到DBContext中。存储库接口将位于域层,但存储库的实现将位于数据层。DI 容器会将其中一个与另一个进行匹配。

这里的技巧是将域层中的所有接口和实现放在它们应该在的地方。并且域层不应该依赖于任何其他层(域项目不会引用数据和Web项目)。但 Web 将依赖于数据层和域层。你只需要Web层中的数据层依赖来配置IoC容器,因为Web层是你的聚合根,IoC应该在那里配置。但是您不应该在任何操作中直接使用数据对象,您应该为存储库或服务注入接口。

关于分层架构已经有很多讨论了,所以首先从洋葱架构开始,然后你就会更好地了解你需要什么。