2014-09-19 67 views
3

我有一個數據層(包含連接的MongoDB),領域層(含回購和實體)和服務層(包含服務和模型)MongoDB中的ObjectID曝光

,因爲現在我的實體使用的ObjectID,他們需要MongoDB的知識(這很好嗎?)

我的服務獲取調用返回這些實體的存儲庫,然後將它們轉換爲模型。由於實體上的ObjectId屬性,這導致我的服務層需要了解MongoDB。

有沒有辦法避免這種情況?我聽說我可以使用我的ID作爲類型字符串,當存儲數據時,MongoDB會將其轉換爲ObjectId?

回答

1

有時僅映射Id可能會引起混淆,並且如果在同一個實體中可能有另一個objectId(也許是引用),會發生什麼情況?

那麼你可以使用地圖convention over configuration模式製作objectId的地圖。看看下面的實現:

public static class MongoDbConventionRegistry 
{ 
    public static void Register() 
    { 
     var conventionPack = new ConventionPack {new StringObjectIdMemberMapConvention()};    
     ConventionRegistry.Register("CustomConventions", conventionPack, t => t.FullName.StartsWith("YourNamespace.Model.Entities.etc")); 
    } 

} 

public class StringObjectIdMemberMapConvention : IMemberMapConvention 
{ 
    private readonly Regex _memberMatchRegex = new Regex(@"(^Id$)|(.+ObjectId?$)",RegexOptions.Compiled); // you can change this regex to match the convention you want 

    public string Name { 
      get { return "StringObjectId"; } 
     } 

     public void Apply(BsonMemberMap memberMap) 
     { 
      if (memberMap == null) 
       return; 
      if(memberMap.MemberType == typeof(string) && _memberMatchRegex.IsMatch(memberMap.ElementName)) 
       memberMap.SetRepresentation(BsonType.ObjectId); 
     } 

    } 

所以這種情況下,任何標識和與OBJECTID結束將被映射到OBJECTID任何其他財產,這樣你就可以留下您的實體ID作爲字符串和驅動程序將處理轉換你,當你不想在系統中的大多數層之間攜帶mongodb依賴時更方便。

您可以將約定更改爲任何您想要的,我只是想要突出該功能。

3

簡版:是的,無處不在。

如果您沒有問題的註釋,然後使用:

[BsonId] 
[BsonRepresentation(BsonType.ObjectId)] 
public string Id { get; set; } 

否則,您可以使用類圖:

BsonClassMap.RegisterClassMap<i_YourModel>(cm => 
{ 
    cm.AutoMap(); 
    cm.SetIdMember(cm.GetMemberMap(x => x.Id) 
    .SetIdGenerator(StringObjectIdGenerator.Instance)); 
} 
); 

龍版本:

明智的做法是使用的東西不透明,儘可能地在模型和服務層中(不可能)直接連接到基礎數據庫實現。

此前,主鍵ID通常是大數字,然後映射到數據庫上的主鍵列。但是,在爲新實體分配新ID時,必須對數據庫進行檢查以確保具有唯一的ID。從LO-HI id生成器到auto_increment列,序列等,存在許多技術。使用NoSQL和更多的並行性需求,大多數應用程序現在使用UUID或其變體,因爲ID可以是以合理的概率生成它,它將是唯一的,而不必詢問數據庫是否真的是唯一的,或者使用序列等,這些是水平擴展的應用程序中的瓶頸。

MongoDB沒有區別,並使用ObjectId這是一種UUID。

這些id(包括mongo和其他)總是可以表示爲字符串,通常是構成密鑰的字節的HEX表示。因此,在您的模型中,使用String作爲ID,在您的服務層中相同,在您的數據層將其轉換爲任何適合您的基礎數據庫實現的格式,在這種情況下爲MongoDB。

+0

所以我的UserModel將有字符串UserId和我的UserEntity也將有字符串UserId?或者仍然需要MongoDb的知識,並在實體 – Luke 2014-09-19 15:10:11

+0

上使用ObjectId試圖澄清答案。 – 2014-09-19 15:19:00