На данный момент у меня есть следующее: метод расширения 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