2010-06-28 3 views
1

Не могли бы вы посоветовать мне, как они реализовали использование функций Imports при использовании шаблона Repository против EF 4.0?Функция Импорт и шаблон хранилища с Entity Framework 4.0

У нас есть таблица, сопоставленная с объектом-кандидатом, а также функция Импорт из существующего sproc, который сопоставляется с кандидатом. Это отлично работает в EF, но мы абстрагируемся с помощью репозиториев, которые берут на себя конструктор IObjectSet, где T является объектом POCO. Однако это означает, что я не могу получить ссылку на импорт функции. Единственный способ, которым я могу это сделать, - передать ссылку на ObjectContext в репозитории, которые в ней нуждаются, но для меня это немного напоминает дизайнерский запах.

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

public class CandidateRepository : Repository<Candidate>, ICandidateRepository 
{ 
    public CandidateRepository(IObjectSet<Candidate> entities) 
     : base(entities) 
    { 
    } 

    public Candidate GetByEmail(string email) 
    { 
     return Entities.SingleOrDefault(c => c.EmailAddress.Equals(email)); 
    } 

    public bool CandidateExists(string candidateNumber) 
    { 
     return Entities.SingleOrDefault(c => c.Number.Equals(candidateNumber)) != null; 
    } 

    public Candidate GetByNumber(string number) 
    { 
     return Entities.SingleOrDefault(c => c.Number.Equals(number)); 
    } 

    public Candidate GetMember(string number) 
    { 

     return new Candidate(); //This one needs to return from the Function Import 
    } 
} 

Любые советы приветствуются.

ответ

1

Для того, чтобы решить вашу проблему, Вы можете положить entities в ObjectSet<T> и использовать entites.Context property, чтобы получить ObjectContext.

public Candidate GetMember(string number) 
{ 
    var objectSet = Enities as ObjectSet<Candidate>; 

    if(objectSet == null) throw new Exception("Oh, it's not EF IObjectSet implementation");   

    return objectSet.Context.MyCustomFunction(string number); 
} 

Как вы можете видеть, этот код зависит от конкретной реализации IObjectSet, которая не годится.

Лучшей идеей является создание репозиториев только для совокупных корней, а не для каждой таблицы. Поэтому более естественно передать ObjectContext в репозиторий ctor.

+0

Спасибо за ответ Юрий. Будете ли вы достаточно любезны рассказать о своем определении «совокупных корней», пожалуйста? Мы не так далеко в разработке, что мы не смогли реорганизовать лучшую расширяемость. –

+0

Ну, «совокупный корень» - это концепция управления доменным дизайном (DDD). Рассмотрим простую модель Order 1. .. * OrderLine. Обычно вы не создавали OrderLine без ордера, поэтому вам понадобится только OrderRepository. Таким образом, Заказ представляет собой совокупный корень, содержащий ссылки на OrderLines. Определение агрегирующих корней - это практический вопрос DDD, который зависит от объектов, которые вы пытаетесь «моделировать» в своем приложении. –

0

Я пошел по этому маршруту, и я испытал, что это не так больно, когда вы передаете реализацию ObjectContext интерфейса в свой репозиторий. Реализация интерфейса должна иметь некоторый способ вызова функции. Поэтому, когда вы проходите конкретную реализацию ObjectContext, все должно работать нормально.

Смежные вопросы