Created
March 22, 2022 13:53
-
-
Save skalahonza/8bfa00edddae904a17fecb6a0c5e0ce5 to your computer and use it in GitHub Desktop.
Dynamic CRUD controller.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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