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

时间:2019-11-13 12:30:02

标签: c# dependency-injection autofac .net-core-3.0 system.text.json

我将此合同解析器用于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等效的技术-如果已经存在?我无法弄清楚这一点,也找不到任何看起来与此界面相似的界面

1 个答案:

答案 0 :(得分: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();
    }
}

通过调用JsonSerializerOptions来设置json扩展,该扩展方法是在命名空间Dahomey.Json中定义的扩展方法SetupExtensions:

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

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

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

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

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