首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用新的. new core-3 json序列化程序进行依赖注入

使用新的. new core-3 json序列化程序进行依赖注入
EN

Stack Overflow用户
提问于 2019-11-13 12:30:02
回答 1查看 2.2K关注 0票数 4

我使用这个合同解析器与AutofacJson.NET进行依赖注入。

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
var contractResolver = ctx.Resolve<IContractResolver>(); // ctx = Autofac's IComponentContext

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

如果已经有了新的System.Text.Json,那么这种技术与net-core-3.0中的新技术有什么等价之处呢?我无法弄清楚这一点,也找不到任何类似于这个界面的界面。

EN

回答 1

Stack Overflow用户

发布于 2019-12-11 22:14:57

请尝试使用我编写的这个库作为System.Text.Json的扩展,以提供缺少的特性:https://github.com/dahomey-technologies/Dahomey.Json

您将发现对编程对象映射的支持。

定义您自己的IObjectMappingConvention实现:

代码语言:javascript
运行
复制
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将多个类型与约定关联:

代码语言:javascript
运行
复制
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();
    }
}

通过调用JsonSerializerOptions (名称空间Dahomey.Json中定义的扩展方法SetupExtensions )来设置json扩展:

代码语言:javascript
运行
复制
JsonSerializerOptions options = new JsonSerializerOptions();
options.SetupExtensions();

为类注册新的对象映射约定:

代码语言:javascript
运行
复制
options.GetObjectMappingConventionRegistry().RegisterProvider(new AutofacObjectMappingConventionProvider());

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

代码语言:javascript
运行
复制
string json = JsonSerializer.Serialize(myClass, options);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58837182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档