我正在尝试学习使用WCF合同的一些最佳实践。我有一个POCO实体类,如下所示:
public class Job : IOwnerEntity<int>, ILoggableEntity
{
public int JobID { get; set; }
public int JobtypeCodeID { get; set; }
public string JobName { get; set; }
public int CustomerID { get; set; }
public int JobStatusID { get; set; }
public DateTime CreationDate { get; set; }
public DateTime ModifiedDate { get; set; }
public virtual Customer Customer { get; set; }
public virtual ICollection<JobUserAssignment> JobUsers { get; set; }
public int OwnerEntityID
{
get
{
return JobID;
}
set
{
JobID = value;
}
}
}
现在,当我创建相应的数据合约时,是否建议在datacontract中包含导航属性(JobUserAssignment和Customer here)。详细说明,推荐的方式是以下哪种合同?
[ServiceContract]
interface IJobService
{
Job GetJob(int id);//Gets job + job.Customer + job.JobUsers
}
或
[ServiceContract]
interface IJobService
{
Job GetJob(int id);//Gets onlyjob
Customer GetCustome(int jobid);
JobUserAssignment[] GetUsers(int jobid);
}
提前致谢,
与Pradeep
答案 0 :(得分:1)
将服务层与数据模型联系起来并不是一种好习惯。您遇到的问题是随着您的数据模型的发展(新列,验证等),您的服务将需要与服务的消费者重新同步。
相反,将数据模型分开,并在WCF层显示不同的对象集。
以下示例已修改您的版本:
以下是这些类的代码:
phpspec run spec/Project/WorkerSpec.php:9
从这里,您使用// Data Layer ---------------------
// In namespace Company.Data.Models
public class Job : IOwnerEntity<int>, ILoggableEntity
{
public int JobID { get; set; }
public int JobtypeCodeID { get; set; }
public string JobName { get; set; }
/* ... others here .... */
}
// -----------------------------------
// Services Layer --------------------
// In namespace Company.Services.Contracts
public interface IJobService
{
Company.Services.Contracts.Job GetJobBy(int id);
}
// In namespace Company.Services.Contracts
[DataContract]
public class Job
{
[DataMember]
public int ID { get; set; }
[DataMember]
public string Name { get; set; }
}
命名空间交换消息。原因是如果您的数据库有一个表的额外列(比如新的Company.Services.Contracts
),那么任何消费者都不会受到影响。
JobCategory
答案 1 :(得分:1)
一如既往:取决于。
如果您检索Job
,始终(或几乎总是)还需要客户和该职位的作业?然后使用方法#1,它始终返回所有内容。
如果您偶尔只需要客户和分配(仅占10%,20%的情况),并且如果检索该信息非常昂贵/效率低下,那么我会使用方法#2来加载真正需要的时候。
如果您总是需要这些信息,那么在一次通话中获取所有内容首选 - 让您的用户调用三种方法来获取所有内容,每次他需要的内容都是毫无意义的。
但是,如果只需要少量的情况下只需要额外的信息 - 那么每次检索Job
时都没有必要完成所有工作 - 在这种情况下,请由用户决定当他需要额外的信息(或不需要它)时。