工具:Mvc4,Sql server,Nhibernate
我正在学习Ntier架构,并计划用一个小例子来学习。这将是一个学生注册申请表,其中包含一份表格 一个。名字 湾姓 C。地址 d。学生卡 该应用程序将能够 一个。通过Id获取学生 湾吸引所有学生 C。注册新生/保存学生 d。编辑学生 即删除学生
我计划拥有以下等级
表示层(单独项目mvc 4应用程序)
---学生表格的html就在这里。我可以在这里使用jquery等 ---我的控制器将调用服务
服务层(单独的项目:类库项目。在这种情况下,只有web将是我的客户端。我将学习稍后在另一个项目中使用webAPI或wcf)
---学生服务
--- IstudentService here
业务层:(单独项目:类库项目) ??
数据层:(单独项目:类库项目) ??
数据库:( sql server database)
现在我感到困惑,我的问题是:
我将在哪里创建我的学生模型(哪一层?)
我将在我的业务层写一下这个学生的例子。
我的数据层会有什么变化?我会写哪种方法?他们是会沟通的方法吗? 直接使用数据库?
一些例子会很棒。我会寻找一个好的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();
}
}
答案 0 :(得分:2)
您可以在数据层中创建模型。您还将在表示层中创建模型(对于您的视图模型)。您通常会在控制器中的数据模型和演示模型之间进行某种映射。
简单的应用程序通常不需要业务层。特别是如果您的应用只是将表单中的数据保存到表中。但是,在这样的应用程序中,您可能会执行诸如“除非您已经完成该课程,否则无法注册此课程”或“您已经注册了比您更多的课程”或“不。这些是必须在某处强制执行的业务规则,通常位于业务层中。
您的数据层可能只是您的实体框架模型。只是您的代码加载并将模型保存到数据库。
有许多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开始,然后你会更好地了解你需要的东西。