簡體   English   中英

使用新的 .net-core-3 json 序列化程序進行依賴注入

[英]Dependency injection with the new .net-core-3 json serializer

我使用這個合約解析器通過AutofacJson.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 
};


net-core-3.0中的新System.Text.Json技術等效的技術是什么 - 如果已經有的話? 我無法弄清楚這一點,也找不到任何與此類似的界面

請嘗試我作為 System.Text.Json 的擴展編寫的這個庫,以提供缺少的功能: https://github.com/dahomey-technologies/Dahomey.ZEED8D85B888A6C0135834240885EE

您將找到對編程 object 映射的支持。

定義自己的 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();
    }
}

通過在命名空間 Dahomey.Json 中定義的擴展方法 SetupExtensions 調用 JsonSerializerOptions 來設置 json 擴展:

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

為 class 注冊新的 object 映射約定:

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

然后使用常規的 Sytem.Text.Json API 序列化您的 class:

string json = JsonSerializer.Serialize(myClass, options);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM