{"id":13629623,"url":"https://github.com/cythral/lambdajection","last_synced_at":"2025-08-19T00:08:50.696Z","repository":{"id":39699062,"uuid":"283859059","full_name":"cythral/lambdajection","owner":"cythral","description":"Framework for building AWS Lambdas using dependency injection and aspect-oriented programming.","archived":false,"fork":false,"pushed_at":"2024-03-10T02:57:38.000Z","size":2043,"stargazers_count":16,"open_issues_count":4,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-08-05T12:56:42.818Z","etag":null,"topics":["aspect-oriented-programming","aws","aws-lambda","csharp","csharp-sourcegenerator","dependency-injection","dotnet"],"latest_commit_sha":null,"homepage":"https://cythral.atlassian.net/jira/software/c/projects/LAMBJ/issues","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cythral.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"cythral","custom":["https://paypal.me/cythral"]}},"created_at":"2020-07-30T19:21:01.000Z","updated_at":"2023-09-19T00:12:52.000Z","dependencies_parsed_at":"2023-12-30T06:28:21.582Z","dependency_job_id":"ff1b2d37-af99-4ca2-80b6-8b51e1f66a72","html_url":"https://github.com/cythral/lambdajection","commit_stats":null,"previous_names":[],"tags_count":48,"template":false,"template_full_name":null,"purl":"pkg:github/cythral/lambdajection","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cythral%2Flambdajection","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cythral%2Flambdajection/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cythral%2Flambdajection/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cythral%2Flambdajection/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cythral","download_url":"https://codeload.github.com/cythral/lambdajection/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cythral%2Flambdajection/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":270142475,"owners_count":24534541,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-12T02:00:09.011Z","response_time":80,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aspect-oriented-programming","aws","aws-lambda","csharp","csharp-sourcegenerator","dependency-injection","dotnet"],"created_at":"2024-08-01T22:01:15.070Z","updated_at":"2025-08-19T00:08:50.591Z","avatar_url":"https://github.com/cythral.png","language":"C#","readme":"# Lambdajection\n[![Nuget](https://img.shields.io/nuget/v/Lambdajection?label=version\u0026style=flat-square)](https://nuget.org/packages/Lambdajection) [![Nuget](https://img.shields.io/nuget/vpre/Lambdajection?label=pre-release\u0026style=flat-square\u0026color=blueviolet)](https://nuget.org/packages/Lambdajection) [![GitHub](https://img.shields.io/github/license/cythral/lambdajection?style=flat-square\u0026color=lightgrey)](./LICENSE.txt) [![GitHub Workflow Status](https://img.shields.io/github/workflow/status/cythral/lambdajection/Continuous%20Integration?style=flat-square)](https://github.com/cythral/lambdajection/actions?query=workflow%3A%22Continuous+Integration%22) [![Codecov](https://img.shields.io/codecov/c/github/cythral/lambdajection?style=flat-square\u0026token=L8FWGHHVU1)](https://codecov.io/gh/cythral/lambdajection/) [![Sponsor on Github](https://img.shields.io/badge/sponsor-on%20github-pink?style=flat-square)](https://github.com/sponsors/cythral) [![Donate on Paypal](https://img.shields.io/badge/donate-on%20paypal-blue?style=flat-square)](https://paypal.me/cythral)\n\nWrite elegant and testable AWS Lambdas + Lambda-backed custom resources using C#/.NET and Microsoft's extensions for dependency injection, configuration and more. Start from a template, add handler code, inject services and let Lambdajection do the rest!\n\nWhy Lambdajection?\n- Easy dependency management: configure dependencies/services using a Startup class, similar to how it is done in ASP.NET Core.\n- Easy secrets management: automatically decrypt options marked as `[Encrypted]` using KMS or your own provided cryptography service.\n- Faster startup times: we're using code generation over reflection wherever possible to help minimize cold-start times.\n- Highly configurable: customize serialization, configuration, and run custom code before your main handler is invoked.\n- Highly testable: facilitates use of dependency-injection to make testing your Lambda easier.\n- Flexibility: you can use AWS' provided runtime or roll your own runtime containing .NET. Lambdajection works both ways, and can even generate code for running on a custom/provided runtime.\n\nCommunity contribution/pull requests are welcome and encouraged! See the [contributing guide](CONTRIBUTING.md) for instructions. Report issues on [JIRA](https://cythral.atlassian.net/jira/software/c/projects/LAMBJ/issues) - you can report anonymously or include github username/contact info on the ticket.\n\n\u003c!-- omit in toc --\u003e\n## Table of Contents\n\n- [1. Installation](#1-installation)\n  - [1.1. Metapackage](#11-metapackage)\n  - [1.2. Templates](#12-templates)\n  - [1.3. Development Builds](#13-development-builds)\n- [2. Packages](#2-packages)\n- [3. Templates](#3-templates)\n- [4. Usage](#4-usage)\n  - [4.1. Lambda Handler](#41-lambda-handler)\n  - [4.2. Request Validation Attributes](#42-request-validation-attributes)\n  - [4.3. Startup Class](#43-startup-class)\n  - [4.4. Customizing Configuration](#44-customizing-configuration)\n  - [4.5. Adding Options](#45-adding-options)\n  - [4.6. Initialization Services](#46-initialization-services)\n  - [4.7. Disposers](#47-disposers)\n  - [4.8. Handler Scheme](#48-handler-scheme)\n  - [4.9. Lambda-Backed Custom Resource Providers](#49-lambda-backed-custom-resource-providers)\n  - [4.10. Custom Runtimes](#410-custom-runtimes)\n  - [4.11. Lambda Layer](#411-lambda-layer)\n- [5. Examples](#5-examples)\n- [6. Acknowledgments](#6-acknowledgments)\n- [7. Donations](#7-donations)\n- [8. Contributing](#8-contributing)\n- [9. Security](#9-security)\n- [10. License](#10-license)\n\n## 1. Installation\n\n### 1.1. Metapackage\nSee the [packages](#2-packages) section for a list of available packages.  Starting in v0.5.0-beta2, you will need to have the .NET 5 SDK installed.\n\n```\ndotnet add package Lambdajection\n```\n\n### 1.2. Templates\n\n```\ndotnet new -i Lambdajection.Templates\n```\n\n### 1.3. Development Builds\n\nDevelopment builds are generated for PRs and uploaded to GitHub Packages.  To use them, update the **user** config file for nuget (varies by OS - see [this article](https://docs.microsoft.com/en-us/nuget/consume-packages/configuring-nuget-behavior)) and add this to the packageSourceCredentials section of that file:\n\n```xml\n\u003cgithub\u003e\n    \u003cadd key=\"Username\" value=\"USERNAME\" /\u003e\n    \u003cadd key=\"ClearTextPassword\" value=\"TOKEN\" /\u003e\n\u003c/github\u003e\n```\n\nReplace USERNAME with your username, and TOKEN with a personal access token from GitHub that has permissions to read packages.  It is important that this goes in the user config file rather than the project one, so that you do not accidentally leak your personal access token to the world.\n\nThen, in your **project**'s nuget.config file, add the following to your packageSources section:\n\n```xml\n\u003cadd key=\"github\" value=\"https://nuget.pkg.github.com/cythral/index.json\" /\u003e\n```\n\nFinally, you may use development builds by adding the package and version to your .csproj, for instance:\n\n```xml\n\u003cPackageReference Include=\"Lambdajection\" Version=\"0.3.0-gc2ca768d3f\" /\u003e\n```\n\nBrowse development builds [here](https://github.com/orgs/cythral/packages?repo_name=lambdajection).\n\n## 2. Packages\n\n|                                        |                                                                                                                                                                                                                               |\n| -------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Lambdajection                          | ![Nuget](https://img.shields.io/nuget/v/Lambdajection?label=version\u0026style=flat-square) ![Nuget](https://img.shields.io/nuget/dt/Lambdajection?color=blue\u0026style=flat-square)                                                   |\n| Lambdajection.Attributes               | ![Nuget](https://img.shields.io/nuget/v/Lambdajection.Attributes?label=version\u0026style=flat-square) ![Nuget](https://img.shields.io/nuget/dt/Lambdajection.Attributes?color=blue\u0026style=flat-square)                             |\n| Lambdajection.Core                     | ![Nuget](https://img.shields.io/nuget/v/Lambdajection.Core?label=version\u0026style=flat-square) ![Nuget](https://img.shields.io/nuget/dt/Lambdajection.Core?color=blue\u0026style=flat-square)                                         |\n| Lambdajection.Generator                | ![Nuget](https://img.shields.io/nuget/v/Lambdajection.Generator?label=version\u0026style=flat-square) ![Nuget](https://img.shields.io/nuget/dt/Lambdajection.Generator?color=blue\u0026style=flat-square)                               |\n| Lambdajection.Encryption               | ![Nuget](https://img.shields.io/nuget/v/Lambdajection.Encryption?label=version\u0026style=flat-square) ![Nuget](https://img.shields.io/nuget/dt/Lambdajection.Encryption?color=blue\u0026style=flat-square)                             |\n| Lambdajection.Templates                | ![Nuget](https://img.shields.io/nuget/v/Lambdajection.Templates?label=version\u0026style=flat-square) ![Nuget](https://img.shields.io/nuget/dt/Lambdajection.Templates?color=blue\u0026style=flat-square)                               |\n| Lambdajection.Runtime                  | ![Nuget](https://img.shields.io/nuget/v/Lambdajection.Runtime?label=version\u0026style=flat-square) ![Nuget](https://img.shields.io/nuget/dt/Lambdajection.Runtime?color=blue\u0026style=flat-square)                                   |\n| Lambdajection.Layer                    | ![Nuget](https://img.shields.io/nuget/v/Lambdajection.Layer?label=version\u0026style=flat-square) ![Nuget](https://img.shields.io/nuget/dt/Lambdajection.Layer?color=blue\u0026style=flat-square)                                       |\n| Lambdajection.Framework                | ![Nuget](https://img.shields.io/nuget/v/Lambdajection.Framework?label=version\u0026style=flat-square) ![Nuget](https://img.shields.io/nuget/dt/Lambdajection.Framework?color=blue\u0026style=flat-square)                               |\n| Lambdajection.Framework.BuildTime      | ![Nuget](https://img.shields.io/nuget/v/Lambdajection.Framework.BuildTime?label=version\u0026style=flat-square) ![Nuget](https://img.shields.io/nuget/dt/Lambdajection.Framework.BuildTime?color=blue\u0026style=flat-square)           |\n| Lambdajection.CustomResource           | ![Nuget](https://img.shields.io/nuget/v/Lambdajection.CustomResource?label=version\u0026style=flat-square) ![Nuget](https://img.shields.io/nuget/dt/Lambdajection.CustomResource?color=blue\u0026style=flat-square)                     |\n| Lambdajection.CustomResource.BuildTime | ![Nuget](https://img.shields.io/nuget/v/Lambdajection.CustomResource.BuildTime?label=version\u0026style=flat-square) ![Nuget](https://img.shields.io/nuget/dt/Lambdajection.CustomResource.BuildTime?color=blue\u0026style=flat-square) |\n\n## 3. Templates\n\nLambdajection .NET templates are available for your convenience.  Run `dotnet new [template-name] --help` to see a list of available options for each template.\n\n\n\u003c!-- omit in toc --\u003e\n### Lambdajection Project\n```\ndotnet new lambdajection\n```\nCreates a new C# project with Lambdajection installed, plus boilerplate for a Lambda Handler and Startup class.\n\n\u003c!-- omit in toc --\u003e\n### Options Class\n```\ndotnet new lambdajection-options\n```\nCreates a new Options class to be injected into your Lambda as an `IOption\u003c\u003e`.\n\n\n## 4. Usage\n\n### 4.1. Lambda Handler\n\nWriting the lambda is simple: Just define a public, partial class that contains a Handle method and annotate the class with the `Lambda` attribute. The `Lambda` attribute requires that you specify a startup class - more on this in the next step. You are not limited to an request/input parameter of type object - this can be any serializable value or reference type. Same goes for the return value, however the return value must be enclosed in a `Task`.\n\n```cs\nusing System.Threading;\nusing System.Threading.Tasks;\n\nusing Amazon.Lambda.Core;\n\nusing Lambdajection.Attributes;\n\nnamespace Your.Namespace\n{\n    [Lambda(typeof(Startup))]\n    public partial class YourLambda\n    {\n        private IRegisteredService yourService;\n\n        public YourLambda(IRegisteredService yourService)\n        {\n            this.yourService = yourService;\n        }\n\n        public Task\u003cobject\u003e Handle(object request, CancellationToken cancellationToken)\n        {\n            return new {\n                foo = request\n            };\n        }\n    }\n}\n\n```\n\n### 4.2. Request Validation Attributes\n\nValidation attributes in the System.ComponentModel.DataAnnotations namespace can be added to request properties, and they will be automatically evaluated against the request before your Lambda runs:\n\n```cs\nusing System.ComponentModel.DataAnnotations;\n\nclass Request\n{\n    [Range(3, 12)]\n    public int Age { get; set; }\n}\n```\n\n\n### 4.3. Startup Class\n\nThe startup class configures services that are injected into the Lambda's IoC container / service collection.\n\n- Use the ConfigureServices method to add services to your lambda.\n  - Use `IServiceCollection.UseAwsService\u003cIAmazonService\u003e` to inject AWS Clients and Client Factories into the lambda. See [the example here.](examples/AwsClientFactories)\n- Optionally use the ConfigureLogging method to configure additional log settings.\n\n```cs\nusing System;\n\nusing Lambdajection.Core;\n\nusing Microsoft.Extensions.Configuration;\nusing Microsoft.Extensions.DependencyInjection;\nusing Microsoft.Extensions.Logging;\n\nnamespace Your.Namespace\n{\n    public class Startup : ILambdaStartup\n    {\n        public IConfiguration Configuration { get; }\n\n        public Startup(IConfiguration configuration)\n        {\n            this.Configuration = configuration;\n        }\n\n        public void ConfigureServices(IServiceCollection services)\n        {\n            // configure injected services here\n            services.AddScoped\u003cIRegisteredService, DefaultRegisteredService\u003e();\n\n            // Add AWS Services by their interface name - the default\n            services.UseAwsService\u003cIAmazonService\u003e();\n        }\n\n        public void ConfigureLogging(ILoggingBuilder logging)\n        {\n            // this method is optional\n            // logging comes preconfigured to log to the console\n        }\n    }\n}\n```\n\n### 4.4. Customizing Configuration\n\nBy default, configuration is environment variables-based. If you would like to use a file-based or other configuration scheme, you may supply a custom configuration factory to the Lambda attribute:\n\n```cs\n[Lambda(typeof(Startup), ConfigFactory = typeof(ConfigFactory))]\npublic partial class Lambda\n{\n    ...\n```\n\nA custom config factory might look like the following:\n```cs\nusing System.IO;\n\nusing Lambdajection.Core;\n\nusing Microsoft.Extensions.Configuration;\n\nnamespace Your.Namespace\n{\n    public class ConfigFactory : ILambdaConfigFactory\n    {\n        public IConfigurationRoot Create()\n        {\n            return new ConfigurationBuilder()\n                .SetBasePath(Directory.GetCurrentDirectory())\n                .AddJsonFile(\"appsettings.json\", optional: true)\n                .Build();\n        }\n    }\n}\n```\n\nSee the [full example here](./examples/CustomConfiguration/README.md).\n\n### 4.5. Adding Options\n\nYou can add an options section by defining a class for that section, and annotating it with the [LambdaOptions attribute](src/Attributes/LambdaOptionsAttribute.cs). If any options are in encrypted form, add the [Encrypted attribute](src/Encryption/EncryptedAttribute.cs) to that property. When the options are requested, the [IDecryptionService](src/Encryption/IDecryptionService.cs) singleton in the container will be used to decrypt those properties. The [default decryption service](src/Encryption/DefaultDecryptionService.cs) uses KMS to decrypt values.\n\n- The Encrypted attribute, IDecryptionService and DefaultDecryptionService are all provided by the `Lambdajection.Encryption` package.\n- Option classes must be in the same assembly as your lambda.\n- You can replace the default decryption service with your own `IDecryptionService` by injecting it as a singleton in your Startup class' `ConfigureServices` method.\n- See [the example for using Encrypted properties.](examples/EncryptedOptions)\n\n```cs\nusing Lambdajection.Encryption;\n\nnamespace Your.Namespace\n{\n    [LambdaOptions(typeof(LambdaHandler), \"SectionName\")]\n    public class ExampleOptions\n    {\n        public string ExampleValue { get; set; }\n\n        [Encrypted]\n        public string ExampleEncryptedValue { get; set; }\n    }\n}\n```\n\n### 4.6. Initialization Services\n\nInitialization services can be used to initialize data or perform some task before the lambda is run.  Initialization services should implement [ILambdaInitializationService](src/Core/ILambdaInitializationService.cs) and be injected into the container as singletons at startup.\n\n### 4.7. Disposers\n\nDisposers can be used to cleanup unmanaged resources, such as open file-handles and network connections. Lambdajection supports Lambdas that implement either [IDisposable](https://docs.microsoft.com/en-us/dotnet/api/system.idisposable), [IAsyncDisposable](https://docs.microsoft.com/en-us/dotnet/api/system.iasyncdisposable) or both.  If you implement both, DisposeAsync will be preferred.\n\n### 4.8. Handler Scheme\n\nWhen configuring your lambda on AWS, the method name you'll want to use will be `Run` (NOT `Handle`). For context, `Run` is a static method generated on your class during compilation.  It takes care of setting up the IoC container, if it hasn't been setup already.\n\nSo, going off the example above, the handler scheme would look like this:\n\n```\nYour.Assembly.Name::Your.Namespace.YourLambda::Run\n```\n\nYou can customize the name of the \"Run\" method via the\nRunnerMethod property of `LambdaAttribute`.\n\n### 4.9. Lambda-Backed Custom Resource Providers\nLambdajection also allows you to write lambda-backed custom resource providers.  Just write create, update and delete methods and Lambdajection will take care of deciding which one gets called + respond to CloudFormation.\n\nJust use the [Custom Resource Provider Attribute](./src/Attributes/CustomResourceProviderAttribute.cs):\n\n```cs\nusing System.Threading.Tasks;\n\nusing Lambdajection.Attributes;\nusing Lambdajection.CustomResource;\n\nnamespace Your.Namespace\n{\n    [CustomResourceProvider(typeof(Startup))]\n    public class Handler\n    {\n        public Task\u003cResponse\u003e Create(CustomResourceRequest\u003cProperties\u003e request, CancellationToken cancellationToken)\n        {\n            ...\n        }\n\n        public Task\u003cResponse\u003e Update(CustomResourceRequest\u003cProperties\u003e request, CancellationToken cancellationToken)\n        {\n            ...\n        }\n\n        public Task\u003cResponse\u003e Delete(CustomResourceRequest\u003cProperties\u003e request, CancellationToken cancellationToken)\n        {\n            ...\n        }\n    }\n\n    public class Response : ICustomResourceOutputData\n    {\n        public string Id { get; set; } // Id becomes the custom resource's PhysicalResourceId.\n\n        /* Any other properties you define here become attributes of the custom resource\n        \n        ie. !GetAtt Resource.YourProperty */\n    }\n\n    public class Properties\n    {\n        /* If the name changes, the Create method will be called instead of update, since the UpdateRequiresReplacement attribute is used here. */\n        [UpdateRequiresReplacement]\n        public string Name { get; set; }\n    }\n}\n```\n\nSee also the [custom resource example](./examples/CustomResource).\n\n### 4.10. Custom Runtimes\n\nLambdajection can be used with custom runtimes starting in v0.5.0-beta2, that way you can use a newer version of .NET as soon as it comes out, even if it is not an LTS release.  \n\nIn order to use custom runtimes, add the `Lambdajection.Runtime` package to your csproj file. You must also specify the `RuntimeIdentifiers` property, with at least `linux-x64` included:\n\n```xml\n\u003cProject\u003e\n    \u003cPropertyGroup\u003e\n        \u003cRuntimeIdentifiers\u003elinux-x64\u003c/RuntimeIdentifiers\u003e\n    \u003c/PropertyGroup\u003e\n\n    \u003cItemGroup\u003e\n        \u003cPackageReference Include=\"Lambdajection\" Version=\"$(LambdajectionVersion)\" /\u003e\n        \u003cPackageReference Include=\"Lambdajection.Runtime\" Version=\"$(LambdajectionVersion)\" /\u003e\n    \u003c/ItemGroup\u003e\n\u003c/Project\u003e\n```\n\nYou may also optionally set the `SelfContained` property:\n  - Set it to true if you want to deploy as a self-contained package.  In this case, Lambdajection will automatically set your assembly name to `bootstrap`.\n  - Set it to false if you want to deploy as a framework dependent package, ie you installed .NET to a Lambda Layer and want to use that to cut-down on deployment package sizes. In this case, your assembly name will remain unchanged.  \n  - In both cases, a main method / program entrypoint will be generated for you with the aid of `Amazon.Lambda.RuntimeSupport`.\n\nSee an example of a [non-self contained lambda using a custom runtime here](./examples/CustomRuntime). (Example documentation coming soon).  Note that the example is using [a Lambda Layer we deployed with a custom bootstrap file.](https://github.com/cythral/dotnet-lambda-layer)\n\n### 4.11. Lambda Layer\n\nYou can use a Lambda Layer containing Lambdajection and all of its dependencies to cut down on package sizes. The layer will be available on the serverless application repository.  Once deployed, you can use it on functions that use the Lambdajection.Runtime package on custom runtimes containing .NET 5.\n\nTo use the layer:\n\n1. Deploy lambdajection-layer from the [Serverless Application Repository](https://console.aws.amazon.com/lambda/home?region=us-east-1#/create/app?applicationId=arn:aws:serverlessrepo:us-east-1:918601311641:applications/lambdajection-layer) to your AWS Account.\n   - You must use the same semantic version as the `Lambdajection` package in your project.\n2. Note the value of the `LayerArn` output in the resulting stack and add it to your Lambda's list of layers.  See the [custom runtime example template](./examples/CustomRuntime/cloudformation.template.yml) on how to do this - specifically the CustomRuntime resource's Layers section.\n3. Add the `Lambdajection.Runtime` and `Lambdajection.Layer` packages to your project (run `dotnet add package Lambdajection.Layer`).\n   - Make sure to use the same version as the `Lambdajection` package in your project.\n4. Finally, you will need to set the `DOTNET_SHARED_STORE` environment variable to `/opt/`.  This is because Lambda Layers are unzipped to that directory, and .NET needs to know where to look for the runtime package store.  \n   - If using [dotnet-lambda-layer](https://github.com/cythral/dotnet-lambda-layer), this environment variable is set for you automatically.\n\n## 5. Examples\n\n- [Injecting and using AWS Services + Factories](examples/AwsClientFactories)\n- [Automatic decryption of encrypted options](examples/EncryptedOptions)\n- [Using a custom serializer](examples/CustomSerializer/README.md)\n- [Using a custom config factory](examples/CustomConfiguration/README.md)\n- [Using a custom runtime + layer](examples/CustomRuntime)\n- [Creating a custom resource provider](examples/CustomResource)\n\n## 6. Acknowledgments\n\n1. [CodeGeneration.Roslyn](https://github.com/aarnott/codegeneration.roslyn) - Was used for compile-time code generation using attributes in versions v0.1.0 - v0.4.0.  Newer versions use .NET 5 Source Generators.\n2. [Simple Lambda Dependency Injection in AWS Lambda .NET Core](https://dev.to/gary_woodfine/simple-dependency-injection-in-aws-lambda-net-core-n0g) by Gary Woodfine - primary inspiration for this project.\n\n## 7. Donations\n\nIf you use this project and find it useful, please consider donating.  Donations are accepted via [Github Sponsors](https://github.com/sponsors/cythral) and [PayPal](https://www.paypal.com/paypalme/cythral).\n\n## 8. Contributing\n\nIssues and feature requests may be reported anonymously on [JIRA Cloud](https://cythral.atlassian.net/jira/software/c/projects/LAMBJ/issues).\nPull requests are always welcome! See the [contributing guide](CONTRIBUTING.md) for more information.\n\n## 9. Security\n\nSecurity issues can be reported on our JIRA.  See our [security policy](SECURITY.md) for more information. \n\n## 10. License\n\nThis project is licensed under the [MIT License](LICENSE.txt).\n","funding_links":["https://github.com/sponsors/cythral","https://paypal.me/cythral","https://www.paypal.com/paypalme/cythral"],"categories":["Source Generators","Do not want to test 112 ( old ISourceGenerator )"],"sub_categories":["Dependency Injection (IoC Container)","1. [ThisAssembly](https://ignatandrei.github.io/RSCG_Examples/v2/docs/ThisAssembly) , in the [EnhancementProject](https://ignatandrei.github.io/RSCG_Examples/v2/docs/rscg-examples#enhancementproject) category"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcythral%2Flambdajection","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcythral%2Flambdajection","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcythral%2Flambdajection/lists"}