Czołem koledzy programiści!
Chcę zaimplementować w swoim projekcie generyczną klasę, która odpowiadać będzie za tworzenie/edycję/usuwanie rekordów z bazy danych.
public class EntityStore<TEntity, TEntityCreateModel, TEntityUpdateModel> where TEntity : class, IEntity
{
private readonly StoreContext context;
private readonly IMapper mapper;
public EntityStore(StoreContext context, IMapper mapper)
{
this.context = context;
this.mapper = mapper;
}
public void Create(TEntityCreateModel model)
{
context.Set<TEntity>().Add(mapper.Map<TEntity>(model));
context.SaveChangesAsync();
}
public void Update(TEntityUpdateModel model)
{
var entity = context.Set<TEntity>().Find(model);
context.Entry(entity).State = System.Data.Entity.EntityState.Modified;
context.SaveChanges();
}
public void Delete(long id)
{
context.Set<TEntity>().Remove(context.Set<TEntity>().Find(id));
context.SaveChanges();
}
}
Zastosowanie powyższego rozwiązania wymaga, aby projekt Webowy posiadał referencję do projektu zawierającego klasy odwzorowujące bazę danych (klasa reprezentowana przez TEntity). Aczkolwiek bardzo często idzie tutaj przeczytać, iż jedynym do czego referencję powinien mieć Web to projekt z Kontraktami/Interfejsami. Czy to tak powinno wyglądać, czy jest inne rozwiązanie dla takiego generyka?
public class ProductController : Controller
{
private readonly EntityStore<Product, ProductCreateModel, ProductUpdateModel> entityStore;
public ProductController(EntityStore<Product, ProductCreateModel, ProductUpdateModel> entityStore)
{
this.entityStore = entityStore;
}
[HttpPost]
public ActionResult Create(ProductCreateModel model)
{
if (ModelState.IsValid)
{
entityStore.Create(model);
return View("List");
}
return View(model);
}
}
Pozdrawiam,
KK