C # Инициализировать свойства класса из клиента REST внутри конструктора - PullRequest
0 голосов
/ 22 октября 2019

Я много искал и думаю, что это возможно, но мне кажется, что я просто не знаю, как правильно его отформатировать.

У меня есть класс, представляющий продукт, который является классом отношенийот нашей CRM до Magento.

Внутри конструктора я должен сделать что-то вроде этого ...

public Product(IBaseProduct netforumProduct, MagentoClient client)
{
    Product existingMagentoProduct = client.GetProductBySku(netforumProduct.Code);

    if (existingMagentoProduct != null)
    {
        this.id = existingMagentoProduct.id;
        this.name = existingMagentoProduct.name;

        ... many of them ...

        this.visibility = existingMagentoProduct.visibility;
        this.extension_attributes.configurable_product_links = existingMagentoProduct.extension_attributes.configurable_product_links;
    }
    else
    {
        //  its a new product, new up the objects
        this.id = -1;
        this.product_links = new List<ProductLink>();
        this.options = new List<Option>();
        this.custom_attributes = new List<CustomAttribute>();
        this.media_gallery_entries = new List<MediaGalleryEntry>();
        this.extension_attributes = new ExtensionAttributes();
        this.status = 0; // Keep all new products disabled so they can be added to the site and released on a specific day (this is a feature, not an issue / problem).
        this.attribute_set_id = netforumProduct.AttributeSetId;
        this.visibility = 0;

    }
}

Кажется глупым, чтобы инициализировать все свойства подобным образом. Я мог бы использовать картограф, но это похоже на бинты. Я должен посмотреть, существует ли продукт сначала в magento, и заполнить его ID и значения, в противном случае, когда я сохраняю продукт, он создает дополнительный. Не удалось получить правильный синтаксис.

Возможно, уже слишком поздно, и мне нужно некоторое время подумать о чем-то другом.

1 Ответ

1 голос
/ 22 октября 2019

Если вы должны сделать это в конструкторе, вы можете избавиться от большого количества кода, сначала установив значения по умолчанию в свойствах Product. Это избавит от необходимости делать их в конструкторе. Далее, если вы хотите автоматически установить свойства класса, вы можете использовать отражение.

public class Product
{
    public int Id { get; set; } = -1;
    public List<ProductLink> Product_Links { get; set; } = new List<ProductLink>();
    ....
    public int Visibility { get; set; } = 0;

    public Product(IBaseProduct netforumProduct, MagentoClient client)
    {
        var existingMagentoProduct = client.GetProductBySku(netforumProduct.Code);
        if (existingMagentoProduct != null)
        {
            foreach (PropertyInfo property in typeof(Product).GetProperties().Where(p => p.CanWrite))
            {
                property.SetValue(this, property.GetValue(existingMagentoProduct, null), null);
            }
        }
    }   
}

Хотя я хотел бы отметить, что вам, вероятно, не следует использовать REST-клиент внутри конструктора класса,особенно, чтобы просто заполнить его данные (также вы выполняете синхронную операцию). Было бы лучше иметь другой слой, который отвечает за заполнение этого класса с помощью клиента, а затем использовать что-то вроде AutoMapper для сопоставления данных с ним.

...