5

工具:Mvc4、Sql server、Nhibernate

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

我计划有以下几层

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

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

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

--- 学生服务在这里

--- 这里是学生服务

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

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

数据库:(sql server 数据库)

现在我很困惑,我的问题是:

  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();
        }
    }
4

2 回答 2

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

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

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

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

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

例如,您可能在业务层中有一个业务对象列表,但出于性能原因,这些对象在数据层中的表示方式不同。但这一切真的不是你现在应该担心的事情。请理解,随着您的应用程序变得越来越复杂,您可能需要以不同的方式做事。

于 2013-07-05T20:34:35.617 回答
1

你需要看看Onion Architecture。就 MVC 版本而言,它有点过时,但层级非常分层。

在 IoC 容器方面,我建议查看Autofac - 易于使用,具有许多功能,例如按约定注册和多租户。

至于你的问题:

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

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

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

于 2013-07-05T20:18:29.083 回答