aspire icon indicating copy to clipboard operation
aspire copied to clipboard

Support injecting `ExtraInterfaces` on generated project metadata during build

Open captainsafia opened this issue 1 year ago • 1 comments

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 { }

captainsafia avatar Sep 11 '24 20:09 captainsafia

I'm gonna move this out of 9.0 since I don't think we'll be able to deliver something before 9.0 for this.

I think this is a good candidate for post-9.0 work though.

We'll have to reason through how some of the changes we applied for Functions, I'm thinking specifically about the endpoint/port related changes for publishing, will mesh with fully modeling Functions as projects.

captainsafia avatar Sep 30 '24 19:09 captainsafia