2015-07-12 72 views
1

我想了解一些使用WCF合同的最佳做法。我有一個POCO實體類如下圖所示:WCF數據合同中的EF導航屬性

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; 
     } 
    } 
} 

現在,當我創建了相應的數據合同,是它推薦給(這裏JobUserAssignment和客戶),包括在datacontract導航性能..?詳細說明,以下哪些合約是推薦的方式?

[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); 
} 

由於提前,

普拉迪普

回答

1

一如往常:這取決於

如果您檢索Job,您是否總是(或幾乎總是)也需要客戶和該作業的分配?然後使用總是返回一切的方法#1。

如果你只需要偶爾需要客戶和作業(僅佔10%,20%的情況),並且如果檢索該信息是非常昂貴/低效的,那麼我會使用方法2加載它們時需要確實需要

在一次調用獲取一切最好,如果你總是無論如何需要這些信息 - 使您的用戶調用三種方法得到的一切,都被他需要的東西,是沒有意義的時間。

但是如果只需要少量的附加信息,只有少數情況下 - 那麼每次檢索Job時都沒有意義 - 在這種情況下,讓用戶決定何時需要附加信息(或不需要它)。

1

這是不是你的服務層綁定到你的數據模型很好的做法。你的問題是隨着你的數據模型的發展(新列,驗證等),你的服務需要重新與服務的使用者同步。

而是將數據模型分開,並在WCF層有一組不同的對象。

下面的例子已經修改您的版本有:

  • 一個類來表示該表在DB
  • 一個類來表示從WCF
  • 發送的數據

這裏是這些類的代碼:

// 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),那麼任何消費者都不會受到影響。

// In namespace Company.Services.Impl 

using Company.Data.Models; 
using Company.Services.Contracts; 

public class WcfJobService : IJobService 
{ 
    public Company.Services.Contracts.Job GetJobBy(int id) 
    { 
     EFDataContext dc = new EFDataContext(); 
     Company.Data.Models.Job dc = dc.Jobs.FirstOrDefault(x=> s.JobID = id); 

     if(dc == null) { return null; } 

     return new Company.Services.Contracts.Job { ID = dc.JobID, Name = dc.JobName }; 
    } 
}