LINQ2SQL DataLayer / Repository Предложение - PullRequest
0 голосов
/ 13 апреля 2010

Мой текущий репозиторий выглядит следующим образом, пожалуйста, предложите, я сейчас использую контекст данных LINQ2SQL для каждой вставки / удаления / обновления

namespace Lib.Repository
{

    public class MotorRenewalDataRepository
    {
        public MotorRenewalDataRepository()         
        {

        }
        public MotorRenewalData GetByID(long id)
        {
            using(var _context=DatabaseFactory.Create(false))
            {
                return _context.MotorRenewalDatas.Where(p => p.MotorRenewalDataID == id).FirstOrDefault();
            }
        }
        public MotorRenewalData Insert(MotorRenewalData entity)
        {
            using (var _context = DatabaseFactory.Create(false))
            {
                _context.MotorRenewalDatas.InsertOnSubmit(entity);
                _context.SubmitChanges();
                return entity;
            }
        }
        public void Update(MotorRenewalData entity)
        {
            using (var _context = DatabaseFactory.Create(true))
            {
                var dbEntity = _context.MotorRenewalDatas.Where(p => p.MotorRenewalDataID == entity.MotorRenewalDataID)
                            .FirstOrDefault();                
                Common.CopyObject<MotorRenewalData>(entity, dbEntity);
                _context.SubmitChanges();

            }

        }

    }
}

1 Ответ

0 голосов
/ 13 апреля 2010

Если я правильно понимаю ваш вопрос, вы ищете предложения о том, как правильно реализовать шаблон хранилища. Вот хорошая практика использования шаблона репозитория. Сначала вы захотите создать интерфейс для своего хранилища. Здесь вы можете определить, что может делать хранилище.

public interface IRepository<T>
{
    void Add(T entity);
    void Delete(T entity);
    void Save();
    IQueryable<T> FindAll();
}

Далее вы можете создавать отдельные репозитории. Первое, что вы хотите сделать здесь, - это создать интерфейс для чего-либо, выходящего за рамки обычного хранилища, которое вы, возможно, делаете.

public interface IMotorRenewalRepository : IRepository<MotorRenewal>
{
    MotorRenewal FindMotorRenewalById(int id);
}

И этот интерфейс будет реализовывать IRepository MotorRenewal, чтобы вы получали все из IRepository и все, что вы определили в IMotorRenewalRepository. Интерфейс чаще всего используется, когда вам нужно использовать какое-то внедрение зависимости при написании поддельных объектов и модульных тестов для вашего хранилища.

Теперь напишите свой MotorRenewalRepository и внедрите IMotorRenewalRepository.

public class MotorRenewalRepository : IMotorRenewalRepository
{
    MyDataContext _dataContext = new MyDataContext();

    public void Add(MotorRenewal motorRenewal)
    {
        _dataContext.MotorRenewals.InsertOnSubmit(motorRenewal);
    }

    public void Delete(MotorRenewal motorRenewal)
    {
        _dataContext.MotorRenewals.DeleteOnSubmit(motorRenewal);
    }

    public void Save()
    {
        _dataContext.SubmitChanges();
    }

    public IQueryable<MotorRenewal> FindAll()
    {
        return _dataContext.MotorRenewals.AsQueryable();
    }

    public User FindMotorRenewalById(int id)
    {
        return _dataContext.MotorRenewals.Where(p => p.MotorRenewalDataID == id).SingleOrDefault();
    }
}

Эта реализация намного проще для понимания. Обратите внимание, что вам не нужно обновление. Обновление - это просто вы извлекаете объект MotorRenewal из хранилища, редактируете его и вызываете .Save ().

Вы можете использовать переменную уровня класса для своего контекста данных, а не создавать новую каждый раз, когда вы вызываете метод в своем хранилище. MyDataContext должен исходить из модели, которую вы создали при перетаскивании классов LinqToSql из подключения к данным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...