2011-02-08 48 views
0

編輯我更新了我的問題的完整性。通用對象創建總是返回空值

我有來自iPHone客戶端的傳入REST調用。它是爲了響應一般請求而使用類型特定的對象 。例如:

http://localhost:81/dashboard/group/id/0

返回從地區類型數據

從客戶http://localhost:81/dashboard/group/id/1

返回數據鍵入

http://localhost:81/dashboard/group/id/2

返回數據從所述用戶鍵入

等等。

的WCF Dashboard.svc服務公開鹼方法GetGroupById 我用來確定並返回特定類型的響應:

公共類控制板:爲RenderingMode。GroupBase,Contracts.IDashboardService { 私人字符串名稱=字符串.Empty;現在

public Dashboard() : base() 
    { 

     if (!ServiceSecurityContext.Current.PrimaryIdentity.IsAuthenticated) 
      throw new WebException("Unauthorized: Class: Dashboard, Method: Dashboard()", 
       System.Net.HttpStatusCode.Forbidden); 

     name = ServiceSecurityContext.Current.PrimaryIdentity.Name; 

    } 

    public override System.IO.Stream GetGroupById(string id) 
    { 
     return base.GetGroupById(id); 
    } 

} 

,我的抽象基類中的GetGroupById有填充 並返回基於相應的groupid參數獨特的數據傳輸對象的開關/ case語句:

  public abstract class GroupBase 
{ 

    protected GroupBase() { } 

    public virtual Stream GetGroupById(string id) 
    { 
     // I have tried assigning response to null or, in this case, 
     // assigning it to a random service object. I have also tried 
     // IObjectFactory response; The last fails at compile-time and 
     // the other two always produce null 
     IObjectFactory response = 
      ObjectFactory<IObjectFactory, UserService>.Create(); 

     var groupId = System.Convert.ToInt32(id); 
     var serializer = new JavaScriptSerializer(); 

     byte[] bytes = null; 

     var message = String.Empty; 

     try 
     { 

      switch (groupId) 
      { 
       case 0: // regions 

        response = ObjectFactory<IObjectFactory, RegionService>.Create(); 
        break; 

       case 1: // customers 

        response = ObjectFactory<IObjectFactory, CustomerService>.Create(); 
        break; 

       case 2: // users 
        response = ObjectFactory<IObjectFactory, UserService>.Create(); 
        break; 
      } 

     } 

     catch (EngageException oops) 
     { 
      message = oops.Message; 
     } 



     bytes = Encoding.UTF8.GetBytes(serializer.Serialize(response)); 

     return new MemoryStream(bytes); 

    } 

} 

一位顧客ObjectFactory類是用於創建類型特定的對象:

public static class ObjectFactory其中T:F,new() { public static F Create() { return new T(); }}

WHERE我有一個問題是什麼是我的ObjectFactory的引擎蓋下回事。我總是 得到** null **回來。例如,考慮下面的REST HTTP GET:

http://localhost:81/dashboard/group/id/2

上述命令是要求數據庫中的所有用戶的JSON字符串。因此,將 UserService類傳遞給ObjectFactory方法。

public class UserService : IObjectFactory 
{ 
    DomainObjectsDto IObjectFactory.Children 
    { 
     get 
     { 

      return new Contracts.DomainObjectsDto(UserRepository 
           .GetAllUsers().Select 
           (p => new Contracts.DomainObjectDto 
           { 
            Title = GroupTypes.Customer.ToString(), 
            Id = p.CustomerId.ToString(), 
            Type = p.GetType().ToString() 
           })); 
     } 

    } 

    string IObjectFactory.Method 
    { 
     get; 
     set; 
    } 

    string IObjectFactory.Status 
    { 
     get; 
     set; 
    } 

    etc... 

而且,只讀獲取財產從UserRepository獲取數據,填充數據傳輸對象 (如下圖所示)

[DataContract] 
public class DomainObjectDto 
{ 
    [DataMember] 
    public string Title { get; set; } 
    [DataMember] 
    public string Id { get; set; } 
    [DataMember] 
    public string Type { get; set; } 
} 

    [CollectionDataContract] 
    public class DomainObjectsDto : List<DomainObjectDto> 
    { 
     public DomainObjectsDto() { } 
     public DomainObjectsDto(IEnumerable<DomainObjectDto> source) : base(source) { } 
    } 

並應用戶數據的序列化JSON字符串返回給客戶端。但是,我的對象工廠類中的通用類型T始終爲空:

public static F Create() 
    { 
     return new T(); // <-- always null! 
    } 

任何想法?

+1

你已經給了我們一些代碼。如果您可以發佈一個簡短但完整的程序來展示問題,那麼瞭解發生的事情會更容易。 – 2011-02-08 19:50:03

+0

謝謝喬恩。我同意:)我已經轉貼了一個完整的問題(我希望)。請讓我知道,如果我已經離開了其他東西,並感謝您的關注。 – 2011-02-08 21:03:13

+0

有趣的 - 看起來,一切工作正常後端,然後當JSON字符串應發佈到客戶端,WCF再次通過整個過程,併產生空。軟的像一秒和不必要的後回 – 2011-02-09 14:56:39

回答

2

很難說沒有在上下文中看到工廠的調用,但我的直覺是groupId不在切換範圍內,因此您得到的默認值爲null。我會添加一個默認情況並拋出一個超出範圍的異常,看看這是你的問題。

+0

謝謝詹姆斯。不,它不會評估爲默認條件。在調試模式下,我可以看到groupid參數正在評估適當的開關/外殼條件。 – 2011-02-08 21:15:59

0

這是一個好主意,默認情況下添加到您的switch語句,如:

default: 
    throw new Exception("groupId " + groupId + " not found"); 
0

改線IObjectFactory response = null;刪除默認的,即IObjectFactory response;。現在,編譯器會告訴你是否有一個分支不分配它(當然,它不能告訴你是否以某種方式分配給null)。還要注意,至少有兩種方法可以從new(等)中獲得null,但these是邊緣情況 - 我懷疑它們是否有貢獻(僅爲完整性提及)。