Предполагая, что вы
- хочу методы создания DTO с определенными значениями по умолчанию
- хочет конструктор по умолчанию и не хочет принудительно использовать фабричные методы
Возможно, ответ состоит в том, чтобы разделить их. Пусть ваш DTO делает свое дело:
public class AddressDto
{
public string RecipientName { get; set; }
public string StreetName { get; set; }
public int HouseNumber { get; set; }
public int? FlatNumber { get; set; }
public string PostalCode { get; set; }
public string City { get; set; }
public string CountryName { get; set; }
}
... и не загромождайте его различными параметрами по умолчанию. Со временем вы можете обнаружить, что вам нужны разные значения по умолчанию для разных сценариев. Я мог видеть, что это становится немного грязным.
Затем возьмите те же статические методы и поместите их в свой собственный класс:
public static class AddressDtoFactory
{
public static AddressDto CreateWithPredefinedValues()
{
return new AddressDto
{
RecipientName = "John Doe",
City = "City",
CountryName = "Country"
};
}
}
Я бы склонялся к «первому способу», при котором фабричный метод заполняет только значения по умолчанию. Причина в том, что немного непросто передавать каждое отдельное свойство в качестве параметра, особенно если они не проходят проверку. Кроме того, вы захотите обновлять этот конструктор каждый раз, когда добавляете свойство.
Другим вариантом будет расширение класса, например:
public static class AddressDtoExtensions
{
public static AddressDto PopulatePredefinedValues(
this AddressDto dto)
{
dto.RecipientName = dto.RecipientName ?? "John Doe";
dto.City = dto.City ?? "City";
dto.CountryName = dto.CountryName ?? "Country";
return dto;
}
}
Это позволяет вам сделать что-то вроде этого:
var dto = new AddressDto
{
HouseNumber = 5,
PostalCode = "12345"
}.PopulatePredefinedValues();
Это дает вам и то и другое - вы можете использовать оба свойства инициализации и добавить свои значения по умолчанию. Также может быть немного удобнее, если вы решите использовать Automapper или что-то в этом роде.