Есть ли способ переопределить коллекцию, которая была инициализирована синтаксисом автоматической инициализации свойств значениями из конфигурации в .Net Core?
У меня есть класс, содержащий мои значения конфигурации:
public class DummyConfiguration
{
public List<DummyConfigurationObject> DummyConfigurationCollection { get; set; } =
new List<DummyConfigurationObject>
{
new DummyConfigurationObject
{
DummyField = "DummyConfigurationObject1",
},
new DummyConfigurationObject
{
DummyField = "DummyConfigurationObject2",
},
};
}
Я использую автоматически инициализированные свойства, чтобы обеспечить разумное значение по умолчанию, которое мне подходит.
А вот и мой appsettings.yaml:
DummyConfigurationCollection:
- DummyField: DummyConfigurationObject3
- DummyField: DummyConfigurationObject4
- DummyField: DummyConfigurationObject5
Когда я вызываю configuration.Get().DummyConfigurationCollection.Count, я получаю 5 причин, по которым коллекция уже инициализирована, а связыватель по умолчанию просто использует метод Add для добавления дополнительных записей. Но вместо этого я хочу полностью заменить мое значение по умолчанию, если в моем файле конфигурации есть некоторые значения, соответствующие этому свойству.
Возможно ли это с привязкой конфигурации по умолчанию?
1 ответ
Да, вы можете настроить свое приложение следующим образом:
services.Configure<DummyConfiguration>(options => {
DummyConfiguration.DummyConfigurationCollection.Clear();
return Configuration.GetSection("DummyConfiguration").Bind(options)
});
Это перегрузка Configure, которая позволяет вам настроить, как выполняется привязка. В этом случае мы очищаем все записи в результирующем экземпляре параметров перед привязкой фактических значений конфигурации.
Позже вы можете использовать это на любом другом сервисе с IOptions<DummyConfiguration>
и он покажет только настроенные значения, а не значения по умолчанию.
Вот репо на github с моим тестированием: https://github.com/bison92/IConfigurationCollectionBinding/tree/c29534f41cf07ea22107493d45999fe546462406
РЕДАКТИРОВАТЬ
Как вы хотите использовать Configuration.Get()
нет никакого способа изменить его поведение, кроме как указать, хотите ли вы попытаться привязать частные свойства или нет AFAIK.
Так что вы можете попробовать реализовать свой собственный ICollection
например, поддержите его двумя списками (значения по умолчанию, токи) и переопределите его методы, чтобы он отвечал токами или значениями по умолчанию, но всегда изменял токи.
public class DefaultBackedCollection<T> : ICollection<T>
{
private readonly IList<T> defaults;
private readonly IList<T> currents = new List<T>();
public DefaultBackedCollection(List<T> defaultElements)
{
defaults = defaultElements ?? new List<T>();
}
public int Count => currents.Any() ? currents.Count : defaults.Count;
public bool IsReadOnly => false;
public void Add(T item)
{
currents.Add(item);
}
public void Clear()
{
currents.Clear();
}
public bool Contains(T item)
{
return currents.Any() ? currents.Contains(item) : defaults.Contains(item);
}
public void CopyTo(T[] array, int arrayIndex)
{
if (currents.Any())
{
currents.CopyTo(array, arrayIndex);
}
else
{
defaults.CopyTo(array, arrayIndex);
}
}
public IEnumerator<T> GetEnumerator()
{
return currents.Any() ? currents.GetEnumerator() : defaults.GetEnumerator();
}
public bool Remove(T item) => currents.Remove(item);
IEnumerator IEnumerable.GetEnumerator()
{
return currents.Any() ? currents.GetEnumerator() : defaults.GetEnumerator();
}
}
Взгляните на обновленный рабочий пример: https://github.com/bison92/IConfigurationCollectionBinding