Как реализовать «строгий» режим добавления в IServiceCollectionC#

Место общения программистов C#
Ответить
Anonymous
 Как реализовать «строгий» режим добавления в IServiceCollection

Сообщение Anonymous »

Я начал реализовывать что-то вроде «строгого» режима для IServiceCollection, который будет вызывать исключение (или даже AggregateException, если это возможно), когда метод расширения AddXXX перезаписывает уже зарегистрированная зависимость. Основная мотивация – убедиться, что при использовании всех методов AddXXX в моей кодовой базе, в которые вносят свой вклад другие, некоторые зависимости не будут случайно перезаписаны.
На данный момент у меня есть следующее: метод расширения AsStrict() для IServiceCollection, который возвращает экземпляр пользовательского интерфейса IStrictServiceCollection (расширяющий IServiceCollection для цепочки), который имеет свой единственный метод КакНормальный(). Он использует захваченный экземпляр IServiceCollection для пересылки методов ICollection, за исключением Add, где я основываю логику исключения на TryAddEnumerable с парой дополнительных if в теле цикла:

Код: Выделить всё

int count = services.Count;
for (int i = 0; i < count; i++) {
ServiceDescriptor service = services[i];
if (service.ServiceType == descriptor.ServiceType &&
service.GetImplementationType() == implementationType &&
object.Equals(service.ServiceKey, descriptor.ServiceKey)) {
// Already added
// no return but
throw new InvalidOperationException(...)
}
}

services.Add(descriptor);
Использование будет следующим:

Код: Выделить всё

services.AddX()
.AsStrict()
.AddY()
.AddZ()
.AsNormal()
.AddXXX
чтобы я мог фиксировать исключения из части цепочки регистрации службы или из всей цепочки. Я уже сталкивался с некоторыми «нормальными» крайними случаями, которые заставили меня опубликовать этот вопрос в надежде, что кто-то сталкивался с большинством/если не со всеми и имеет более надежную реализацию.

Подробнее здесь: https://stackoverflow.com/questions/793 ... collection
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»