A C# source generator that automatically creates API client code from repository interfaces.
Given a repository interface annotated with [GenerateApi], AutoRepo generates:
IApi{Name}- Refit-compatible interface with HTTP method attributesApi{Name}Client- HttpClient-based implementationFallback{Name}- Local-first wrapper with API fallbackCombined{Name}- Merged wrapper that queries both local and remote sources in parallel
Add AutoRepo as an analyzer reference:
<ProjectReference Include="path/to/AutoRepo.csproj"
OutputItemType="Analyzer"
ReferenceOutputAssembly="false" />Annotate your repository interfaces:
using AutoRepo;
[GenerateApi(RoutePrefix = "/api/products")]
public interface IProductRepository
{
Task<IReadOnlyList<Product>> GetAllAsync(CancellationToken ct = default);
Task<Product?> GetAsync(int id, CancellationToken ct = default);
Task UpsertAsync(Product product, CancellationToken ct = default);
Task DeleteAsync(int id, CancellationToken ct = default);
}If your entities need custom JSON converters (e.g., for strongly-typed IDs), specify a JsonOptionsType:
[GenerateApi(RoutePrefix = "/api/products", JsonOptionsType = "MyApp.MyJsonOptions")]
public interface IProductRepository { ... }The type must have a static Default property returning JsonSerializerOptions.
- HTTP method inference:
Get*/Search*/Find*-> GET,Delete*/Remove*-> DELETE,Create*/Add*-> POST,Update*-> PUT,Upsert*-> POST (with body) or PUT - Route parameters: Parameters named
idor ending withIdin Get/Delete methods - Body parameters: Complex types in POST/PUT methods
- Query parameters: Primitive types that aren't route parameters
- Source tracking: If entities have a
Sourceproperty of typeDataSource, generated wrappers set it toLocal,Remote, orBoth - Fallback strategy: Single items -> local-first; Collections -> API-first; Mutations -> local-only
- Combined strategy: All reads query both sources in parallel and merge; Mutations -> local-only
- Local-only methods: Methods starting with
GetStoredorGetLibrarystay local-only in Combined wrapper
- .NET SDK with Roslyn source generators support
- Refit (for the generated Refit interface)
Microsoft.Extensions.Logging(for Fallback/Combined wrappers)