首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AWS Lambda函数中的依赖注入( .Net Core2.2)

AWS Lambda函数中的依赖注入( .Net Core2.2)
EN

Stack Overflow用户
提问于 2019-08-27 13:39:51
回答 1查看 1.4K关注 0票数 0

我正在尝试使用.Net Core2.2创建一个AWS lambda函数,方法如下

https://aws.amazon.com/blogs/developer/announcing-amazon-lambda-runtimesupport/

我需要实现依赖注入来注入DBContxt,还有业务层的接口。

由于appraoch建议在这个类中只有静态方法作为lambda函数,我的构造函数注入似乎不起作用,因为唯一执行的方法是lambda函数,我试图创建一个静态构造函数和静态初始化器,但它们都没有执行。

以下是示例代码

代码语言:javascript
复制
using Amazon.Lambda.Core;
using Amazon.Lambda.RuntimeSupport;
using Amazon.Lambda.Serialization.Json;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Threading.Tasks;

namespace Lambda
{
    public class DoSomething
    {
        // Configuration Service
        public static IConfigurationService ConfigService { get; set; }
        public static IManager Manager { get; set; }

        public static DoSomething()
        {
            Console.WriteLine("Static initializer begin....");
            // Set up Dependency Injection
            var serviceCollection = new ServiceCollection();
            ConfigureServices(serviceCollection);
            var serviceProvider = serviceCollection.BuildServiceProvider();

            // Get Configuration Service from DI system
            ConfigService = serviceProvider.GetService<IConfigurationService>();
            Console.WriteLine("Static initializer done....");
        }
        // Use this ctor from unit tests that can mock IConfigurationService
        public DoSomething(IConfigurationService configService, IManager Manager)
        {
            Console.WriteLine("Constructor being....");
            ConfigService = configService;
            Manager = Manager;
            Console.WriteLine("Constructor done....");
        }
        /// <summary>
        /// The main entry point for the custom runtime.
        /// </summary>
        /// <param name="args"></param>
        private static async Task Main(string[] args)
        {
            Func<ILambdaContext, string> func = Expire;
            using(var handlerWrapper = HandlerWrapper.GetHandlerWrapper(func, new JsonSerializer()))
            using(var bootstrap = new LambdaBootstrap(handlerWrapper))
            {
                Console.WriteLine("Main done 0....");
                await bootstrap.RunAsync();
            }
            Console.WriteLine("Main done....");
        }

        /// <summary>
        /// Lambda function to expire items.
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public static string Expire(ILambdaContext context)
        {
            Console.WriteLine("Expire called....");
            // Get config setting using input as a key
            var temp = Manager.Expire();
            context.Logger.LogLine($"Processing-3 ..... {temp}");
            return temp;
        }

        static void ConfigureServices(IServiceCollection serviceCollection)
        {
            // PostgreSQL Configuration.
            serviceCollection.AddEntityFrameworkNpgsql().AddDbContext<DbContext>(opt =>
                opt.UseNpgsql(ConfigService.GetConfiguration().GetConnectionString("DbConnection"))
                );

            // Register services with DI system
            serviceCollection.AddTransient<IEnvironmentService, EnvironmentService>();
            serviceCollection.AddTransient<IConfigurationService, ConfigurationService>();
            serviceCollection.AddTransient<IRepository, Repository>();
            serviceCollection.AddTransient<IManager, Manager>();
        }
    }
}
EN

回答 1

Stack Overflow用户

发布于 2019-10-17 08:57:02

我能够使用提及AWS教程和托尼·斯奈德的教程https://blog.tonysneed.com/2018/12/16/add-net-core-di-and-config-goodness-to-aws-lambda-functions/来运行DI,但是从Main方法调用DI初始化,因为它需要是静态的。

代码语言:javascript
复制
public class Function
{
    private static IConfigurationService _configService;
    private static IServiceProvider _serviceProvider;

    private static async Task Main(string[] args)
    {
        // Setup DI
        var serviceCollection = new ServiceCollection();
        ConfigureServices(serviceCollection);
        _serviceProvider = serviceCollection.BuildServiceProvider();

        // Get Configuration Service from DI
        _configService = _serviceProvider.GetService<IConfigurationService>();

        // Setup Lambda
        Func<string, ILambdaContext, string> func = FunctionHandler;
        using (var handlerWrapper = HandlerWrapper.GetHandlerWrapper(func, new JsonSerializer()))
        using (var bootstrap = new LambdaBootstrap(handlerWrapper))
        {
            await bootstrap.RunAsync();
        }
    }

    private static void ConfigureServices(IServiceCollection services)
    {
        // Register services with DI system
        services.AddTransient<IConfigurationService, ConfigurationService>();
        services.AddTransient<IEnvironmentService, EnvironmentService>();

        // DI DBContext
        services.AddDbContext<MyDBContext>(options => options.UseSqlServer(_configService.GetConfiguration().GetConnectionString("MyDBConnection")));

        // Other DI
        services.AddTransient<IMyService, MyService>();
    }

    public static string FunctionHandler(string input, ILambdaContext context)
    {
        var myService = _serviceProvider.GetService<IMyService>();
        return myService.DoSomething(input);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57668257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档