У меня два класса:
public class UploadedBankData : BankData {
[DataMember(Name = "sf__Id")]
public new string SalesforceId {
get => base.SalesforceId;
set => base.SalesforceId = value;
}
[DataMember(Name = "sf__Created")]
public bool SalesforceCreated { get; set; }
}
и
public class UploadedPersonAccount : PersonAccount {
[DataMember(Name = "sf__Id")]
public new string SalesforceId {
get => base.SalesforceId;
set => base.SalesforceId = value;
}
[DataMember(Name = "sf__Created")]
public bool SalesforceCreated { get; set; }
}
Как вы можете видеть, кроме имени класса и класса, который они расширяют, оба класса идентичны.
Эти классы существуют только потому, что я использую ServiceStack.Text
для преобразования базового класса в CSV, загружаю CSV в Salesforce через Bulk API 2.0 (для которого SaleforceId должен быть помечен [IgnoreDataMember]
или загрузка будет FAIL ) , а затем будут извлечены вновь созданные записи с вновь созданными идентификаторами SalesforceIds, которые будут снова присвоены соответствующим записям со следующим кодом:
public Dictionary<string, T> Update<T, TU>(Dictionary<string, T> oldSObjectBySalesforceAccountId, RelayerContext context)
where TU : T
where T : AlternativeIdentifiable {
IConfiguration config = context.Config;
string url = $"{config["SalesforceInstanceBaseUrl"]}/services/data/{config["SalesforceVersion"]}/jobs/ingest/{context.job.Id}/successfulResults";
this.restClient.Get(url, context.token)
.FromCsv<List<AlternativeIdentifiable>>()
.ForEach((updatedBankData) => {
if (oldSObjectBySalesforceAccountId.TryGetValue(updatedBankData.GetAlternativeId(), out T oldSObject)) {
oldSObject.SalesforceId = updatedBankData.SalesforceId;
}
});
return oldSObjectBySalesforceAccountId;
}
Поскольку это решение может в конечном итоге поддерживать дополнительные объекты SO, для создания поддержки потребуется много почти идентичных классов.
Есть ли лучший способ?