Я использую пользовательский JsonConverter и JsonSerializerSettings.TypeNameHandling = TypeNameHandling.Objects
для создания необходимых экземпляров во время десериализации.Экземпляры создаются путем разрешения типов из контейнера IOC Autofac.Все работает нормально, кроме ...
У меня есть несколько "базовых объектов", которые запрашивают уникальный идентификатор в конструкторе из службы (который правильно вводится в конструктор).При десериализации это не должно происходить, потому что это довольно дорого, и идентификаторы будут заполняться из файла Json в любом случае после создания экземпляра.
В настоящее время при разрешении из пользовательского JsonConverter я использую _scope.Resolve<T>(new TypedParameter(typeof(IIdService), null));
to then - в вызываемом конструкторе - проверьте на null и действуйте соответственно.
Некоторые люди, по-видимому, считают несколько конструкторов хуже, чем запах кода при использовании IOC (что заставляет меня задуматься, почему Autofac предлагает несколько функций, касающихсятема), но в контексте десериализации я думаю, что это может иметь смысл.
Насколько я могу судить, у Autofac есть механизмы, позволяющие решить, какой конструктор использовать при регистрации , но не когда разрешения .Моим предпочтительным решением было бы добавить пользовательский атрибут в конструктор (например, [CtorForDeserializing]
) и использовать его для принятия решения.Это возможно?