Привет, глядя на шаблон репозитория, который обычно, кажется, реализован примерно так:
public class GenericRepository<TEntity> where TEntity : class
{
// other business
public virtual TEntity GetByID(object id)
{
return db.Set().Find(id);
}
public virtual void Insert(TEntity entity)
{
db.Set().Add(entity);
}
public virtual void Delete(object id)
{
TEntity entityToDelete = db.Set().Find(id);
Delete(entityToDelete);
}
public virtual void Update(TEntity entityToUpdate)
{
db.Set().Attach(entityToUpdate);
context.Entry(entityToUpdate).State = EntityState.Modified;
}
}
Итак, для каждого типа, с которым вы хотите работать (например, обновления), вам нужно создать экземпляр репозитория.
Итак, если бы у меня было два типа, которые я хотел бы сохранить Машины
и Грузовики
, мне нужно было бы пойти:
var carRepository = new GernericRepository<Car>();
carRepository.Update(myCar);
var truckRepository = new GernericRepository<Truck>();
carRepository.Update(myTruck);
Итак, у вас есть отдельные репозитории для каждого типа. Чтобы убедиться, что вы сохраняете все сразу, вам понадобится unitOfWork
, чтобы убедиться, что все они используют один и тот же контекст и сохраняют одновременно.
Конечно, не лучше иметь что-то вроде:
public class GenericRepository
{
// other business
public virtual TEntity GetByID<TEntity>(object id) where TEntity : class
{
return db.Set<TEntity>().Find(id);
}
public virtual void Insert<TEntity>(TEntity entity) where TEntity : class
{
db.Set<TEntity>().Add(entity);
}
public virtual void Delete<TEntity>(object id) where TEntity : class
{
TEntity entityToDelete = db.Set<TEntity>().Find(id);
Delete(entityToDelete);
}
public virtual void Update<TEntity>(TEntity entityToUpdate) where TEntity : class
{
db.Set<TEntity>().Attach(entityToUpdate);
context.Entry(entityToUpdate).State = EntityState.Modified;
}
}
Это означает, что репозиторий нужно создать только один раз, и поэтому он действительно является универсальным?
Итак, вы можете обновить свои автомобили и грузовики следующим образом:
var repository = new GernericRepository<Car>();
repository.Update<Car>(myCar);
rRepository.Update<Truck>(myTruck);
Конечно, это лучший метод? Я что-то упускаю? Он также автоматически имеет только один контекст.