Внедрение зависимостей с помощью нового сериализатора json .net-core-3

Я использую этот преобразователь контрактов для внедрения зависимостей с Autofac и Json.NET:

public class AutofacContractResolver : DefaultContractResolver
{
    private readonly IComponentContext _container;

    public AutofacContractResolver(IComponentContext context)
    {
        _container = context ?? throw new ArgumentNullException(nameof(context));
    }

    protected override JsonObjectContract CreateObjectContract(Type objectType)
    {
        var contract = base.CreateObjectContract(objectType);

        // use Autofac to create types that have been registered with it
        if (_container.IsRegistered(objectType))
        {
            contract.DefaultCreator = () => _container.Resolve(objectType);
        }

        return contract;
    }
}

Затем я использую его с DI для инициализации JsonSerializer:

var contractResolver = ctx.Resolve<IContractResolver>(); // ctx = Autofac's IComponentContext

var jsonSerializer = new JsonSerializer
{
    ContractResolver = contractResolver, // <-- AutofacContractResolver 
};


Что было бы эквивалентом этого метода с новым System.Text.Json в net-core-3.0 - если они уже есть? Я не смог это понять и не смог найти никаких интерфейсов, которые были бы похожи на эти.


person t3chb0t    schedule 13.11.2019    source источник
comment
Это интересно. Я не уверен, встроено ли в него что-то подобное.   -  person Nkosi    schedule 13.11.2019
comment
@Nkosi Я боялся, что кто-нибудь может это сказать. Это было бы большим препятствием для шоу. Я надеюсь, что они что-то внедряют в долгосрочной перспективе.   -  person t3chb0t    schedule 13.11.2019
comment
Эквивалентные типы в System.Text.Json - _ 2_ и _ 3_ - являются внутренними. Существует открытое усовершенствование эквивалент DefaultContractResolver в System.Text.Json # 42001 с запросом общественный эквивалент.   -  person dbc    schedule 26.11.2019
comment
Связанные или повторяющиеся: System.Text.Json API есть что-то вроде IContractResolver, на которое также нет ответа.   -  person dbc    schedule 26.11.2019


Ответы (1)


Попробуйте эту библиотеку, которую я написал как расширение для System.Text.Json, чтобы предложить недостающие функции: https://github.com/dahomey-technologies/Dahomey.Json.

Вы найдете поддержку программного сопоставления объектов.

Определите свою собственную реализацию IObjectMappingConvention:

public class AutofacObjectMappingConvention : IObjectMappingConvention
{
    private readonly IComponentContext _container;

    public AutofacObjectMappingConvention(IComponentContext context)
    {
        _container = context ?? throw new ArgumentNullException(nameof(context));
    }


    public void Apply<T>(JsonSerializerOptions options, ObjectMapping<T> objectMapping) where T : class
    {
        defaultObjectMappingConvention.Apply<T>(options, objectMapping);

        // use Autofac to create types that have been registered with it
        if (_container.IsRegistered(objectType))
        {
            objectMapping.MapCreator(o => _container.Resolve<T>());
        }
    }
}

Реализуйте IObjectMappingConventionProvider, чтобы связать более одного типа с соглашением:

public class AutofacObjectMappingConventionProvider : IObjectMappingConventionProvider
{
    public IObjectMappingConvention GetConvention(Type type)
    {
        // here you could filter which type should be instantiated by autofac and return null for other types
        return new AutofacObjectMappingConvention();
    }
}

Настройте расширения json, вызвав в JsonSerializerOptions метод расширения SetupExtensions, определенный в пространстве имен Dahomey.Json:

JsonSerializerOptions options = new JsonSerializerOptions();
options.SetupExtensions();

Зарегистрируйте новое соглашение об отображении объектов для класса:

options.GetObjectMappingConventionRegistry().RegisterProvider(new AutofacObjectMappingConventionProvider());

Затем сериализуйте свой класс с помощью обычного API Sytem.Text.Json:

string json = JsonSerializer.Serialize(myClass, options);
person Michaël Catanzariti    schedule 11.12.2019