microsoft / microsoft/aspire

Support injecting `ExtraInterfaces` on generated project metadata during build

Open
#5,683 3 comments 0 reactions 0 assignees View on GitHub
area-integrations azure azure-functions
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.