как разработать шаблон репозитория, чтобы можно было легко переключиться на другой ORM позже?

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

Я достиг этой реализации: альтернативный текст

а вот код:

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 to sql, и, как вы видите, мой код привязан к LINQ to sql, как изменить дизайн этого кода для достижения моей цели «иметь возможность легко перейти на другой ORM, например в структуру сущностей ADO.net, или дозвуковой "

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


person Amr Elgarhy    schedule 02.10.2009    source источник


Ответы (1)


Включает текст на стене

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

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

Возьмем, к примеру, вы решили перейти на Linq to Entities или ADO.NET.

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

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

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

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

person Omar    schedule 02.10.2009