2017-04-15 96 views
0

我有一個DocumentDb數據庫的存儲庫。我的文檔都有一組共同屬性,所以所有文檔都實現了IDocumentEntity接口。是否有可能在C#中有額外的(忽略)屬性?

public interface IDocumentEntity { 
    [JsonProperty("id")] 
    Guid Id { get; set; } 

    [JsonProperty("documentClassification")] 
    DocumentClassification DocumentClassification { get; set; } 
} 

public class KnownDocument : IDocumentEntity { 
    [JsonProperty("id")] 
    Guid Id { get; set; } 

    [JsonProperty("documentClassification")] 
    DocumentClassification DocumentClassification { get; set; } 

    [JsonProperty("knownProperty")] 
    string KnownProperty { get; set; } 
} 

public class BaseDocumentRepository<T> where T : IDocumentEntity { 
    public Set(T entity) { 
     // ... stuff 
    } 
} 

這工作正常與KnownDocument我知道所有的屬性。但是,當然,對於一個Document Db來說最棒的是我不需要知道所有的屬性(並且在很多情況下我不會)。

所以我的客戶端提交有點像這個 -

{unknownProperty1: 1, unknownProperty2: 2}

而且我想這UPSERT使用我的文檔庫。

public OtherDocumentService() { 
_otherDocumentService = new OtherDocumentRepository(); 
} 

public UpsertDocument(dynamic entity) { 
    entity.id = new Guid(); 
    entity.documentClassification = DocumentClassification.Other; 

    _otherDocumentRepository.Set(entity); 
} 

,但我得到一個InvalidCastException從dynamicIDocumentEntity。我認爲這是因爲動態對象上存在的額外屬性,但不在IDocumentEntity接口上?

我想要做的事情是讓我的文檔實體處於動態狀態,但依靠一些屬性來維護它們。

回答

0

傳遞給UpsertDocument的實體參數應該明確地實現IDocumentEntity,以使代碼有效,僅僅具有Id屬性是不夠的。

一些選項:

1)代理可以應用於:

public class ProxyDocumentEntity : IDocumentEntity 
{ 
     public dynamic Content { get; private set; } 

     public ProxyDocumentEntity(dynamic @content) 
     { 
      Content = @content; 
     } 

     public Guid Id 
     { 
      get { return Content.Id; } 
      set { Content.Id = value; } 
     } 
} 

...用

public void UpsertDocument(dynamic entity) 
{ 
      entity.Id = new Guid();   
      repo.Set(new ProxyDocumentEntity(entity)); 
} 

所存儲的文件將具有嵌套的對象屬性,這可能是不能接受的

2)有一個lib https://github.com/ekonbenefits/impromptu-interface它創建代理dynamica lly 並且不會像上面的解決方案那樣產生額外的屬性。 缺點是性能不佳。

技術上講,它可能是2種方法:

public void UpsertDocument(IDocumentEntity entity){...} 
public void UpsertDocument(dynamic entity){...} 

所以第一個(快)將爲其實現IDocumentEntity和第二(慢)的其餘對象的對象。 但是這是一個猜測,因爲我不知道你所擁有的項目的整個代碼庫的細節。

+0

這是不幸的,但似乎是它必須要走的路 –

0

如果你有一定的靈活性,以如何命名的動態屬性,你可以把它們塞進你的對象上的字典屬性:

public Dictionary<string, dynamic> extra { get; set; } 
相關問題