Частный установщик .NET Core Cosmos для идентификатора не заполняется - PullRequest
0 голосов
/ 03 сентября 2018

Я новичок в .NET Core, так что извините, если этот вопрос не очень подходит для Stackoverdlow. Я использую CosmosDB с .NET Core 2.1. У меня есть простой класс, я сохраняю коллекцию ниже.

public class Customer
{
    public string Id { get; private set; }
    public string FirstName { get; private set; }
    public string LastName { get; private set; }

    public Customer(string firstName, string lastName) {

        if (string.IsNullOrWhiteSpace(firstName) || string.IsNullOrWhiteSpace(lastName))
        {
            throw new ArgumentException("First and Last name are required");
        }

        this.FirstName = firstName;
        this.LastName = lastName;
    }
}

Обратите внимание на приватный набор, потому что Id автоматически генерируется базой данных и никогда не должен устанавливаться вызывающим.

Когда я сохраняю записи и извлекаю их, свойство Id не заполняется. Однако, если я изменю сеттер на общедоступный, он будет работать нормально Это действительно простой пример, но в идеале я должен быть в состоянии сделать Id setter приватным, так как он должен быть неизменным вне класса. В прошлом я использовал такие библиотеки, как Hibernate в Java, где это работало нормально, потому что поле было установлено с помощью отражения.

Есть ли способ .NET Core и CosmosDB обрабатывать приватный сеттер? Я могу видеть, где это может привести к проблеме в домене, таком как Order, при попытке реализовать подход OOP / DDD.

public class Order
{
    public int Id { get; private set; }
    public IList<LineItem> LineItems { get; private set; }

    public void AddLineItem(LineItem lineItem) {
        // do some business logic, encapsulatng the line items
        // IE don't just let the caller have free reign 
    }
}

public class LineItem 
{
    public string SKU { get; set; }
    public int Qty { get; set; }
    public decimal PricePerUnit { get; set; }
}

1 Ответ

0 голосов
/ 04 сентября 2018

Так как CosmosDb имеет предопределенное свойство id, вам необходим сериализатор JSON для привязки к нему, и, поскольку он чувствителен к регистру, вот атрибут, который позволяет вам сделать это:

public class Customer
{
    [JsonProperty("id")]
    public string Id { get; private set; }
    // other members
}

Лично я предпочитаю добавить еще одно свойство для хранения любых несопоставленных свойств

/// <summary>
/// Any unmapped properties from the JSON data deserializes into this property.
/// </summary>
[JsonExtensionData]
public IDictionary<string, JToken> UnmappedData { get; set; }

Таким образом, по крайней мере во время отладки мне стало известно о любом свойстве, которое я мог упустить из-за чувствительности к регистру, опечаток и т. Д.

По сути, мой базовый класс для модели CosmosDb выглядит так:

/// <summary>
/// Implements auto generated Id property for CosmosDb Model
/// </summary>
public abstract class BaseModel
{
    /// <summary>
    /// PK for this model. (apart from the ResourceId which is internally generated by CosmoDb)
    /// If the user does not set this, the SDK will set this automatically to a GUID.
    /// </summary>
    [JsonProperty(PropertyName = "id")]
    public virtual string Id { get; set; }

    /// <summary>
    /// Any unmapped properties from the JSON data deserializes into this property.
    /// </summary>
    [JsonExtensionData]
    public IDictionary<string, JToken> UnmappedData { get; set; }
}
...