Skip to content

Instantly share code, notes, and snippets.

@skalahonza
Created March 22, 2022 13:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save skalahonza/8bfa00edddae904a17fecb6a0c5e0ce5 to your computer and use it in GitHub Desktop.
Save skalahonza/8bfa00edddae904a17fecb6a0c5e0ce5 to your computer and use it in GitHub Desktop.
Dynamic CRUD controller.
using Microsoft.AspNetCore.Mvc;
namespace Petricords.API.Controllers;
public class SamplesController : ApiController
{
private readonly IServiceProvider _services;
public SamplesController(IServiceProvider services)
{
_services = services;
}
[HttpGet]
public IReadOnlyList<CrudItemBase> GetAll()
{
var test = "some data";
var generic = typeof(CrudItem<>); // CrudItem<>
var constructed = generic.MakeGenericType(test.GetType()); // CrudItem<string>
generic = typeof(CrudService<>); // CrudService<>
constructed = generic.MakeGenericType(constructed); // CrudService<CrudItem<string>>
var service = _services.GetRequiredService(constructed);
var baseService = service as CrudService ?? throw new Exception();
return baseService.AllItems;
}
[HttpPost]
public CrudItemBase Insert(CrudItem<string> data)
{
// this is how we will se the input
var input = data as CrudItemBase;
var generic = typeof(CrudService<>); // CrudService<>
var constructed = generic.MakeGenericType(input.GetType()); // CrudService<CrudItem<string>>
var service = _services.GetRequiredService(constructed);
var baseService = service as CrudService ?? throw new Exception();
baseService.Add(input);
return baseService.AllItems.Last();
}
}
public abstract class CrudService
{
public abstract void Add(CrudItemBase item);
public abstract IReadOnlyList<CrudItemBase> AllItems { get; }
}
public class CrudService<T> : CrudService
where T : CrudItemBase
{
private readonly List<T> _list = new();
public void Add(T item) => _list.Add(item);
public override void Add(CrudItemBase item) =>
Add(item as T ?? throw new Exception());
public override IReadOnlyList<CrudItemBase> AllItems => _list.OfType<CrudItemBase>().ToList();
}
public abstract class CrudItemBase {}
public class CrudItem<T> : CrudItemBase
{
public CrudItem(T value)
{
Value = value;
}
public T Value { get; }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment