Профи шаблонов репозитория и минусы каждой реализации

Привет, глядя на шаблон репозитория, который обычно, кажется, реализован примерно так:

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);

Конечно, это лучший метод? Я что-то упускаю? Он также автоматически имеет только один контекст.

8
задан Nick Larsen 28 July 2011 в 00:18
поделиться