Как спроектировать шаблон репозитория, чтобы потом было легче переключаться на другой ORM? - PullRequest
5 голосов
/ 02 октября 2009

Я новичок в шаблоне репозитория, но я пытался, моя цель - сделать дизайн, который позволил бы мне с несколькими изменениями «внедрение зависимостей или изменения конфигурации» переключаться на другой ORM, не затрагивая другое решение слои.

Я достиг этой реализации: alt text

и вот код:

public interface IRepository<T>
{
    T Get(int key);
    IQueryable<T> GetAll();
    void Save(T entity);
    T Update(T entity);
    // Common data will be added here
}
public interface ICustomerRepository : IRepository<Customer> 
{
    // Specific operations for the customers repository
}
public class CustomerRepository : ICustomerRepository
{
    #region ICustomerRepository Members

    public IQueryable<Customer> GetAll()
    {
        DataClasses1DataContext context = new DataClasses1DataContext();
        return from customer in context.Customers select customer;
    }

    #endregion

    #region IRepository<Customer> Members

    public Customer Get(int key)
    {
        throw new NotImplementedException();
    }

    public void Save(Customer entity)
    {
        throw new NotImplementedException();
    }

    public Customer Update(Customer entity)
    {
        throw new NotImplementedException();
    }

    #endregion
}

использование на моей странице aspx:

protected void Page_Load(object sender, EventArgs e)
    {
        IRepository<Customer> repository = new CustomerRepository();
        var customers = repository.GetAll();

        this.GridView1.DataSource = customers;
        this.GridView1.DataBind();
    }

Как вы видели в предыдущем коде, я сейчас использую LINQ для SQL, и, как вы видите, мой код привязан к LINQ для SQL, как изменить этот дизайн кода для достижения моей цели "легко перейти на другой ORM , например, для структуры сущностей ADO.net, или дозвуковой "

Пожалуйста, советуйте с простым примером кода

1 Ответ

3 голосов
/ 02 октября 2009

Inc Wall o 'Text

То, что вы делаете правильно, ваш код будет применяться к каждому хранилищу.

Как вы заявили, цель шаблона Repository состоит в том, чтобы вы могли поменять способ доставки данных в ваше приложение без необходимости рефакторинга кода в вашем приложении (пользовательский интерфейс / уровень доставки).

Взять, к примеру, вы решили переключиться на Linq для Entities или ADO.NET.

Все, что вам нужно, это написать код для ORM, который вы будете использовать (он должен наследовать правильный интерфейс), а затем заставить ваш код использовать этот репозиторий. Конечно, вам нужно будет заменить все ссылки на старый репозиторий или переименовать / заменить ваши старые репозитории ORM, чтобы ваше приложение использовало правильные (если вы не используете какой-либо тип контейнера IoC, в котором вы бы указали, какой репозиторий передать) .

Остальная часть вашего приложения будет продолжать работать должным образом, поскольку все методы, которые вы использовали для получения / редактирования ваших данных, будут возвращать правильные объекты.

С точки зрения непрофессионала, репозитории предоставят вашему приложению необходимые данные таким же образом. Разница лишь в том, как эти данные извлекаются из вашей базы данных (ADO.NET/Linq к чему-либо и т. Д.)

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

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