Support injecting `ExtraInterfaces` on generated project metadata during build
- Dominant language
- C#
- Stars
- 6.3k
- Forks
- 991
- Avg merge
- 2d 15h
- Merged PRs (30d)
- 196
Description
For some scenarios, specifically Azure Functions, we want to implement Functions-specific behavior in Aspire APIs like Azure Functions. We currently achieve this by defining a custom `AzureFunctionsResource` resource type that is a wrapper around the default `ProjectResource` type. This pattern allows us to model specific behavior to target `AzureFunctionsResource`. However, it requires that users call the `AddAzureFunctionsProject` extension method in order to be able to invoke Functions-specific code.
An additional approach is to support attaching additional metadata into pre-existing `ProjectResources` and support targeting our Functions-specific methods onto that interface:
```
public class AzureFunctionsTest_Functions : global::Aspire.Hosting.IProjectMetadata, IFunctionsMetadata
```
In order to support this scenario, we need to be able to customize the interfaces that are applied to the `AzureFunctionsTest_Functions` type via MSBuild and the cogeneration step. To achieve this, we need to support an `@(ExtraInterfaces)` property that hosting packages can populate with additional interfaces that need to be applied on projects they target.
The flow of this would look as follows:
- An Azure Functions project referencing the worker SDK would set an `IsAzureFunctionsProject=true` property
- During build-time the Aspire app host will generate project metadata for all project references in a project, at this point in time we'll query the projects to see if they implement the Azure Functions interface
- ExtraInterfaces will be populated with this metadta
```
// package: Aspire.Hosting
namespace Aspire.Hosting;
public interface IFunctionsProjectMetadata { }
```
Contributor guide
Assessment
This issue has not been assessed yet.