Microsoft.Azure.WebJobs.Extensions.AzureCosmosDb.Mongo/Trigger/CosmosDBMongoTriggerBinding.cs (72 lines of code) (raw):
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
using Microsoft.Azure.WebJobs.Host.Bindings;
using Microsoft.Azure.WebJobs.Host.Listeners;
using Microsoft.Azure.WebJobs.Host.Protocols;
using Microsoft.Azure.WebJobs.Host.Triggers;
using Microsoft.Extensions.Logging;
using MongoDB.Bson;
using MongoDB.Driver;
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Threading.Tasks;
namespace Microsoft.Azure.WebJobs.Extensions.AzureCosmosDb.Mongo
{
internal class CosmosDBMongoTriggerBinding : ITriggerBinding
{
private readonly ParameterInfo _parameter;
private readonly MongoCollectionReference _monitoredCollectionRef;
private readonly ILogger _logger;
public CosmosDBMongoTriggerBinding(ParameterInfo parameter, MongoCollectionReference monitoredCollectionRef, ILogger logger)
{
this._parameter = parameter;
this._monitoredCollectionRef = monitoredCollectionRef;
this._logger = logger;
}
public Type TriggerValueType => typeof(ChangeStreamDocument<BsonDocument>);
public IReadOnlyDictionary<string, Type> BindingDataContract => new Dictionary<string, Type>
{
{ "CosmosDBMongoTrigger", typeof(ChangeStreamDocument<BsonDocument>) }
};
public Task<ITriggerData> BindAsync(object value, ValueBindingContext context)
{
var valueProvider = new CosmosDBMongoValueProvider(value);
var bindingData = new Dictionary<string, object>
{
{ "CosmosDBMongoTrigger", value }
};
return Task.FromResult<ITriggerData>(new TriggerData(valueProvider, bindingData));
}
public Task<IListener> CreateListenerAsync(ListenerFactoryContext context)
{
if (context == null) throw new ArgumentNullException(nameof(context));
return Task.FromResult<IListener>(
new CosmosDBMongoTriggerListener(context.Executor, this._monitoredCollectionRef, this._logger));
}
public ParameterDescriptor ToParameterDescriptor()
{
return new TriggerParameterDescriptor()
{
Name = "CosmosDBMongoTrigger",
};
}
private class CosmosDBMongoValueProvider : IValueProvider
{
private readonly object value;
public CosmosDBMongoValueProvider(object value)
{
this.value = value;
}
public Type Type => typeof(ChangeStreamDocument<BsonDocument>);
public Task<object> GetValueAsync()
{
return Task.FromResult(this.value);
}
public string ToInvokeString() => string.Empty;
public Task SetValueAsync(object value, object cancellationToken)
{
return Task.CompletedTask;
}
}
}
}