Created
October 7, 2020 05:50
-
-
Save pksorensen/236b9be4ef6155e88f7aacdd43202a18 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using Microsoft.Azure.WebJobs.Description; | |
using Microsoft.Azure.WebJobs.Host.Bindings; | |
using Microsoft.Azure.WebJobs.Host.Config; | |
using Microsoft.Azure.WebJobs.Host.Protocols; | |
using System; | |
using System.Collections.Generic; | |
using System.Threading.Tasks; | |
namespace DotNetDevOps.Extensions.AzureEventGrid.EventManagerApi.Authorization | |
{ | |
[Binding] | |
[AttributeUsage(AttributeTargets.Parameter | AttributeTargets.ReturnValue)] | |
public class InjectAttribute : Attribute | |
{ | |
} | |
public class InjectBindingProvider : IBindingProvider | |
{ | |
public Task<IBinding> TryCreateAsync(BindingProviderContext context) | |
{ | |
return Task.FromResult(new InjectBinding { Type = context.Parameter.ParameterType } as IBinding); | |
} | |
} | |
public class InjectBinding : IBinding | |
{ | |
public Type Type { get; set; } | |
public bool FromAttribute => throw new NotImplementedException(); | |
public Task<IValueProvider> BindAsync(object value, ValueBindingContext context) | |
{ | |
throw new NotImplementedException(); | |
} | |
public Task<IValueProvider> BindAsync(BindingContext context) | |
{ | |
return Task.FromResult(new InjectValue | |
{ | |
Type = Type, | |
Context = context | |
} as IValueProvider); | |
} | |
public ParameterDescriptor ToParameterDescriptor() | |
{ | |
return new ParameterDescriptor | |
{ | |
Name = "test", | |
Type = "test", | |
DisplayHints = new ParameterDisplayHints | |
{ | |
DefaultValue = "world", | |
Description = "test", | |
Prompt = "helo" | |
}, | |
ExtendedProperties = new Dictionary<string, Newtonsoft.Json.Linq.JToken> {{ "hello", "world" } | |
} | |
}; | |
} | |
} | |
public class InjectValue : IValueProvider | |
{ | |
public Type Type { get; set; } | |
public BindingContext Context { get; set; } | |
public Task<object> GetValueAsync() | |
{ | |
var field = Context.ValueContext.FunctionContext.GetType().GetField("_functionInvocationServices", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); | |
var sp = field.GetValue(Context.ValueContext.FunctionContext) as IServiceProvider; | |
return Task.FromResult(sp.GetService(Type)); | |
//WARNING, this do not use the service provider, a new object is created but not tracked by scoped service provider and disposed ect. | |
return Task.FromResult(Context.ValueContext.FunctionContext.CreateObjectInstance(Type)); | |
} | |
public string ToInvokeString() | |
{ | |
return null; | |
} | |
} | |
[Extension(nameof(InjectExtension))] | |
public class InjectExtension : IExtensionConfigProvider | |
{ | |
public InjectExtension() | |
{ | |
} | |
public void Initialize(ExtensionConfigContext context) | |
{ | |
context.AddBindingRule<InjectAttribute>() | |
.Bind(new InjectBindingProvider()); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment