Пример стратегии извлечения в шаблоне репозитория с использованием чистой структуры POCO Entity - PullRequest
0 голосов
/ 16 января 2011

Я пытаюсь развернуть шаблон стратегии со структурой сущностей и шаблоном репозитория на простом примере, таком как User и Post, в котором у пользователя много сообщений.

Из этого ответа здесь , у меня есть следующий домен:

public interface IUser {
  public Guid UserId { get; set; }
  public string UserName { get; set; }
  public IEnumerable<Post> Posts { get; set; }
}

Добавьте интерфейсы для поддержки ролей, в которых вы будете использовать пользователя.

public interface IAddPostsToUser : IUser {
  public void AddPost(Post post);
}

Теперь мой репозиторий выглядит так:

public interface IUserRepository {
  User Get<TRole>(Guid userId) where TRole : IUser;
}

Стратегия (Где я застрял). Что мне делать с этим кодом? Могу ли я привести пример того, как это реализовать, куда мне это поместить?

public interface IFetchingStrategy<TRole> {
  TRole Fetch(Guid id, IRepository<TRole> role)
}

Моя основная проблема заключалась в том, что задавали в этот вопрос . Мне бы хотелось, чтобы пользователи без постов и пользователи с постами использовали шаблон стратегии.

Ответы [ 2 ]

1 голос
/ 17 января 2011

Если мы говорим о шаблоне стратегии, тогда IFetchingStrategy должен быть передан в IUserRepository, поэтому я думаю, что вам следует изменить операцию Get:

public interface IUserRepository 
{   
    User Get<TRole>(Guid userId, IFetchingStrategy<TRole> strategy) where TRole : IUser; 
} 

Но я не уверен, как реализовать такие интерфейсы с EF.

Если мы вернемся к вашему прежнему вопросу, это также можно сделать следующим образом:

public interface IUserRepository 
{   
    User Get(Guid userId, IEnumerable<Expression<Func<User,object>>> eagerLoading); 
} 

public class UserRepository : IUserRepository
{
    public User Get(Guid userId, IEnumerable<Expression<Func<User,object>>> eagerLoading)
    {
        ObjectQuery<User> query = GetBaseQuery(); // get query somehow, for example from ObjectSet<User>

        if (eagerLoading != null)
        {
            foreach(var expression in eagerLoading)
            {
                // This is not supported out of the box. You need this:
                // http://msmvps.com/blogs/matthieu/archive/2008/06/06/entity-framework-include-with-func-next.aspx
                query = query.Include(expression);
            }
        }

        return query.SingleOrDefault(u => u.Id == userId);
    }
}

Вы будете использовать метод следующим образом:

User userWithoutPosts = repository.Get(guid, null);
User userWithPosts = repository.Get(guid, new List<Expression<Func<User,object>>>
    {
        u => u.Posts 
    });

Но я предполагаю, что эта реализация работает только для первого уровня свойств навигации.

0 голосов
/ 06 апреля 2012

Ответ в следующем посте использует шаблон стратегии для управления запросом.

https://codereview.stackexchange.com/questions/3560/is-there-a-better-way-to-do-dynamic-filtering-and-sorting-with-entity-framework

...