Mvc4:N层架构

时间:2013-07-05 20:02:26

标签: c# asp.net-mvc-4 n-tier-architecture

工具:Mvc4,Sql server,Nhibernate

我正在学习Ntier架构,并计划用一个小例子来学习。这将是一个学生注册申请表,其中包含一份表格 一个。名字 湾姓 C。地址 d。学生卡 该应用程序将能够 一个。通过Id获取学生 湾吸引所有学生 C。注册新生/保存学生 d。编辑学生 即删除学生

我计划拥有以下等级

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

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

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

---学生服务

--- IstudentService here

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

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

数据库:( sql server database)

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

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

  2. 我将在我的业务层写一下这个学生的例子。

  3. 我的数据层会有什么变化?我会写哪种方法?他们是会沟通的方法吗? 直接使用数据库?

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

  4. 以下是示例代码:

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

答案 0 :(得分:2)

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

  2. 简单的应用程序通常不需要业务层。特别是如果您的应用只是将表单中的数据保存到表中。但是,在这样的应用程序中,您可能会执行诸如“除非您已经完成该课程,否则无法注册此课程”或“您已经注册了比您更多的课程”或“不。这些是必须在某处强制执行的业务规则,通常位于业务层中。

  3. 您的数据层可能只是您的实体框架模型。只是您的代码加载并将模型保存到数据库。

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

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

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

答案 1 :(得分:1)

您需要查看Onion Architecture。就MVC版本而言,它有点过时了,但层次分层很大。

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

关于你的问题:

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

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

关于分层架构已有很多人说过,所以首先从Onion Architecture开始,然后你会更好地了解你需要的东西。