所以我一直坚持我正在努力完成这个项目,我试图让这个架构正确完成。我使用MVC和Entity Framework,我决定使用n层模型将我的应用程序分层。所以我有以下内容:
数据层 - >这是实体框架所在的位置,我使用代码优先方法,所以我有映射到表的模型。
我还有返回这些模型的存储库(数据访问)等。例如:
MyModel - >包含映射到数据库表的属性
MyRepo - >包含执行Add(MyModel模型),Save(MyModel模型)等方法。
服务层 - >这是我打算保留所有业务逻辑的地方,这个层引用了数据层,我可以在这里传递模型。
例如: MakePurchase(MyModel模型),可以在这里获取MyModel对象,因为服务层引用/取决于数据层
UI图层 - >这是使用MVC的前端,所以我的问题是如何从数据层获取模型到这里而不引用它或依赖它?理想情况下,我只希望它依赖于服务层,因为如果UI层也依赖于数据层,那么它是不是紧密耦合?这是否意味着我必须从UI中的数据层维护相同的模型集?另外,前端的模型也与数据层中的模型不同,例如:
数据层模型类似于:
MyModel
{
public int Id;
public int Name;
public int CategoryId;
}
而前端的模型类似于:
MyModel
{
public int Id;
public int Name;
public int CategoryId;
public List<String> Categories; // Which I could use to populate a dropdown box
}
我希望这有道理吗?所以我在数据层和UI层的不同模型之间停留,因为我必须将UI层模型映射到数据层模型才能将其传递到控制器中的服务层吗?但同样的事情是我不想在我的控制器中引入太多代码,我不想将它紧紧地耦合到数据层。
由于
答案 0 :(得分:3)
我的方法是在服务层创建一个模仿数据库模型的业务模型。
例如:
在您的数据层中,您有课程
class MyModel
{
public int Id;
public int Name;
public int CategoryId;
}
然后在您的业务层中,创建一个模仿MyModel
的类。
class MyModelB
{
public int Id;
public int Name;
public int CategoryId;
public List<String> Categories;
}
添加新数据时,UI图层将创建MyModelB
个对象。然后在您的服务层中将其转换为MyModel
对象。
// service layer
public void Add(MyModelB model)
{
MyModel obj = new MyModel();
obj.Id = model.Id;
obj.Name = model.Name;
obj.CategoryId = model.CategoryId;
MyModelRepository r = new MyModelRepository ();
r.Add(obj);
}
从数据库获取数据时,在将对象从服务层返回到UI层之前将其转换为业务模型。
// service layer
public MyModelB GetMyModelById(int id)
{
MyModelRepository r = new MyModelRepository ();
MyModel model = r.GetMyModelById(id);
if(model != null)
{
MyModelB obj = new MyModelB();
obj.Id = model.Id;
obj.Name = model.Name;
obj.CategoryId = model.CategoryId;
}
else return null;
}
无论如何,您可以使用AutoMapper来处理数据层和业务层的映射对象属性,反之亦然。