DI in Azure Functions

后端 未结 11 1070
庸人自扰
庸人自扰 2020-12-25 10:43

I have some class libraries that I use in my ASP.NET Web API app that handle all my backend stuff e.g. CRUD operations to multiple databases like Azure SQL Database, Cosmos

11条回答
  •  独厮守ぢ
    2020-12-25 11:26

    I have been using SimpleInjector perfectly fine in Azure Functions. Just create a class (let's call it IoCConfig) that has the registrations and make a static instance of that class in function class so that each instance will use the existing instance.

    public interface IIoCConfig
    {
        T GetInstance() where T : class;
    }
    
    public class IoCConfig : IIoCConfig
    {
        internal Container Container;
    
        public IoCConfig(ExecutionContext executionContext, ILogger logger)
        {
            var configurationRoot = new ConfigurationBuilder()
                .SetBasePath(executionContext.FunctionAppDirectory)
                .AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
                .AddEnvironmentVariables()
                .Build();
    
            Container = new Container();
            Configure(configurationRoot, logger);
        }
    
        public IoCConfig(IConfigurationRoot configurationRoot, ILogger logger)
        {
            Container = new Container();
            Configure(configurationRoot, logger);
        }
    
        private void Configure(IConfigurationRoot configurationRoot, ILogger logger)
        {
            Container.RegisterInstance(typeof(IConfigurationRoot), configurationRoot);
            Container.Register();
        }
    
        public T GetInstance() where T : class
        {
            return Container.GetInstance();
        }
    }
    

    Then in root:

       public static class SomeFunction
    {
        public static IIoCConfig IoCConfig;
    
        [FunctionName("SomeFunction")]
        public static async Task Run(
            [ServiceBusTrigger("some-topic", "%SUBSCRIPTION_NAME%", Connection = "AZURE_SERVICEBUS_CONNECTIONSTRING")]
            SomeEvent msg,
            ILogger log,
            ExecutionContext executionContext)
        {
            Ensure.That(msg).IsNotNull();
    
            if (IoCConfig == null)
            {
                IoCConfig = new IoCConfig(executionContext, log);
            }
    
            var someType = IoCConfig.GetInstance();
            await someType.Handle(msg);
        }
    }
    

提交回复
热议问题