从CosmosDB ChangefeedObserver文档中获取对象类型

时间:2019-06-18 00:20:04

标签: c# azure-cosmosdb

我有一个项目,需要使用CosmosDB Change Feed监视多个cosmosDB中的多个集合。

ChangeFeedObserver的签名非常明确,我不清楚如何传递ComosDb.Document(json格式)表示的对象类型。

public Task ProcessChangesAsync(IChangeFeedObserverContext context, IReadOnlyList<Document> deltas, CancellationToken cancellationToken)

由于这个原因,我有一系列的观察者,它们只有一个不同。传递给处理的类的名称。

DocumentObserverHelper.Processing<MyType>(context, deltas, cancellationToken);

使用该类型,我的助手可以反序列化和处理文档。虽然现在我有一些观察员班。 例如: MyType1Observer.cs,MyType2Observer.cs,MyType3Observer.cs,MyType4Observer.cs

所有类都共享相同的基类,因此我一直在尝试使用类型的绑定器反序列化它们,但是据我所知,这需要为类型命名的属性。

            JsonSerializerSettings jsettings = new JsonSerializerSettings()
        {
            TypeNameHandling = TypeNameHandling.All,
            TypeNameAssemblyFormatHandling = TypeNameAssemblyFormatHandling.Simple,
            SerializationBinder = this.knownTypesBinder,
        };


BaseCosmosDBDocument baseCosmosDBDocument = (BaseCosmosDBDocument)JsonConvert.DeserializeObject(payload, jsettings);

这当然导致无法将JsonObject反序列化为BaseCosmosDbDocument(或它的派生类)

我希望使用一个可以用目标类类型实例化或可以确定目标类类型的观察者类

1 个答案:

答案 0 :(得分:0)

无法弄清楚这一点,想一想,观察者json和这些json的adls处理之间只有一个隐式契约。结果,我使用了正则表达式来将Collection Name与ChangeFeed Context隔离为数据类型信号。然后,该信号用于相应地路由文件进行处理

            Regex rx = new Regex(@"\b(\w+$)");
        var observerCollection = rx.Match(context.FeedResponse.ContentLocation);