У меня есть много классов моделей, которые я заполняю данными, извлеченными из службы веб-API. Все классы имеют много общих свойств, таких как дата создания и т. Д.
public class Car
{
public int CarId { get; set; }
[Browsable(false)]
public int CreatedBy { get; set; }
[DisplayName("Utworzył")]
public string CreatedByName { get; set; }
[DisplayName("Data utworzenia")]
public DateTime CreatedOn { get; set; }
[Browsable(false)]
public int? LmBy { get; set; }
[DisplayName("Zmodyfikował")]
public string LmByName { get; set; }
[DisplayName("Data modyfikacji")]
public DateTime? LmOn { get; set; }
[Browsable(false)]
public int TenantId { get; set; }
[Browsable(false)]
public string TenantName { get; set; }
}
Все классы моделей также имеют методы для создания / обновления связанных сущностей в БД. Например, методы класса «Car»:
public async Task<bool> Add()
{
using (var client = new HttpClient())
{
string url = Secrets.ApiAddress + $"CreateCar?token=" + Secrets.TenantToken + "&UserId=" + RuntimeSettings.UserId;
var serializedProduct = JsonConvert.SerializeObject(this);
var content = new StringContent(serializedProduct, Encoding.UTF8, "application/json");
var result = await client.PostAsync(new Uri(url), content);
if (result.IsSuccessStatusCode)
{
var rString = await result.Content.ReadAsStringAsync();
T _this = JsonConvert.DeserializeObject<T>(rString);
this.CarId = _this.CarId;
return true;
}
else
{
return false;
}
}
}
public async void Edit()
{
using (var client = new HttpClient())
{
string url = Secrets.ApiAddress + $"EditCar?token=" + Secrets.TenantToken + "&id={0}&UserId={1}";
var serializedProduct = JsonConvert.SerializeObject(this);
var content = new StringContent(serializedProduct, Encoding.UTF8, "application/json");
var result = await client.PutAsync(String.Format(url, this.CarId, RuntimeSettings.UserId), content);
}
}
Так что я подумал, что было бы неплохо создать один класс моделей для всех остальных. Он будет иметь все общие свойства:
public abstract class Entity<T>
{
[Browsable(false)]
public int CreatedBy { get; set; }
[DisplayName("Utworzył")]
public string CreatedByName { get; set; }
[DisplayName("Data utworzenia")]
public DateTime CreatedOn { get; set; }
[Browsable(false)]
public int? LmBy { get; set; }
[DisplayName("Zmodyfikował")]
public string LmByName { get; set; }
[DisplayName("Data modyfikacji")]
public DateTime? LmOn { get; set; }
[Browsable(false)]
public int TenantId { get; set; }
[Browsable(false)]
public string TenantName { get; set; }
}
Это будет использоваться, как показано ниже:
public class Car : Entity<Car>
{
public int CarId { get; set; }
}
У меня проблема с методами. Если я сохраню их в родительском классе (а не для того, чтобы создавать их для каждого дочернего элемента, поскольку 90% логики используется совместно), я не могу использовать свойство идентификатора дочернего элемента (CarId) в родительских методах просто потому, что такие свойства не существуют в родительском:
public async Task<bool> Add()
{
using (var client = new HttpClient())
{
string url = Secrets.ApiAddress + $"Create{typeof(T).Name}?token=" + Secrets.TenantToken + "&UserId=" + RuntimeSettings.UserId;
var serializedProduct = JsonConvert.SerializeObject(this);
var content = new StringContent(serializedProduct, Encoding.UTF8, "application/json");
var result = await client.PostAsync(new Uri(url), content);
if (result.IsSuccessStatusCode)
{
var rString = await result.Content.ReadAsStringAsync();
T _this = JsonConvert.DeserializeObject<T>(rString);
this.CarId = _this.CarId; // CarId doesn't exist in parent, it's child's property
return true;
}
else
{
return false;
}
}
}
public async void Edit()
{
using (var client = new HttpClient())
{
string url = Secrets.ApiAddress + $"Edit{typeof(T).Name}?token=" + Secrets.TenantToken + "&id={0}&UserId={1}";
var serializedProduct = JsonConvert.SerializeObject(this);
var content = new StringContent(serializedProduct, Encoding.UTF8, "application/json");
var result = await client.PutAsync(String.Format(url, this.CarId, RuntimeSettings.UserId), content); // CarId doesn't exist in parent, it's child's property
}
}
Вероятно, если бы я использовал более общие имена свойств идентификатора (Id вместо CarId), это было бы проще, но предполагая, что я должен придерживаться пользовательских имен ("CarId", "EmployeeId") - каков мой выбор?
Может быть, я мог бы создать универсальное свойство ID в parent и каким-то образом связать его с соответствующим полем id ребенка, когда я наследую?