我正在开发一个WCF服务应用程序。它将成为大型系统的一部分。它提供了一些业务逻辑,并基于实体框架4.1。我想将应用程序代码分为2层(VS,dll中的项目):Service(包含业务逻辑)和DAL。
我的项目中有这样的数据库模型
ClassModel
classID : int, PK
classIdentity : string
teacherName : string
statisticInfo : int
isRegistered : bool
StudentModel
studentID : int, PK
studentIdentity : string
classID : int, FK
为此,我使用dbContext模板生成代码,我得到:
public partial class ClassModel
{
public ClassModel()
{
this.Student = new HashSet<StudentModel>();
}
public int ClassID { get; set; }
public string ClassIdentity { get; set; }
public string TeacherName { get; set; }
public int StatisticInfo { get; set; }
public bool IsRegistered { get; set; }
public virtual ICollection<TerminalModel> Terminal { get; set; }
}
public partial class StudentModel
{
public int StudentID { get; set; }
public string StudentIdentity { get; set; }
public bool IsRegistered { get; set; }
public virtual ClassModel Class { get; set; }
}
我想通过该服务仅公开一些此类信息,因此我将不同的模型作为数据合同:
[DataContract]
public class Clas{
[DataMember]
public string ClassIdentity {get;set;}
[DataMember]
public string TeacherName {get;set;}
[DataMember]
public string ClassMark {get;set;} //computed from statisticInfo
[DataMember]
public int NumberOfStudents {get;set;} //amount of students in this class
}
我的ServiceContract:
[OperationContract]
public void RegsterClass(Clas clas); //(if given clas does not exists adds it and) sets its isRegistered column to True
[OperationContract]
public Clas GetClass(string classIdentity);
正如您所看到的,某些字段不存在,其他字段正在计算中。 在这种情况下,我对如何正确构建应用程序有一些担忧。你能用你认为合适的方式编写实现接口方法的示例代码吗?
答案 0 :(得分:0)
尝试使用T4模板
可以使用T4模板生成dbContext类,数据传输目标(稍后会详细介绍),接口以及模型中每个实体的所有两种方法:RegsterClass和GetClass。 (这会为每个实体转换为RegsterStudent,GetStudent等) 然后,您可以在NuGet上使用AutoMapper从Clas映射到ClassModel。
我已经实现了类似的东西。我没有通过网络传递任何基于dbcontext的实体。我为每个实体使用数据传输对象。因此,丰田实体拥有一个具有数据注释的ToyotaDto,并用于所有WCF CRUD操作。当“获取”一个toyotaDto时,我将丰田映射到ToyotaDto并返回Dto,当保存时,我将Dto映射到一个实体,当然删除是通过密钥完成的,因此不需要Dto。 您可以在线修改several(1) good(2) examples(3)以适应,如果您愿意,我可以粘贴我正在使用的一些模板。