Неправильно относиться к дизайну доступа к данным, используя множество методов - PullRequest
0 голосов
/ 21 июля 2011

Когда я начинал, у меня был интерфейс:

public interface IBlogReader
{
    BlogPost GetLatest();
    IEnumerable<BlogPost> FindByDate(DateTime from, int limit);
    IEnumerable<BlogPost> FindByCategory(string category, int limit);
    IEnumerable<BlogPost> FindByAuthor(string author, int limit);
}

Затем мне потребовались различные варианты запросов (FindByAuthorWithCategory, FindByDateWithAuthor и т. Д.), И я решил, что мне нужно изменить подход, так как это будет расти. Мне нужно больше и разные запросы. Затем у меня был интерфейс, такой как:

public struct FindCriteria
{
    DateTime? from;
    string category;
    string author;
}

public interface IBlogReader
{
    BlogPost GetLatest();
    IEnumerable<BlogPost> Find(FindCriteria criteria);
}

Интерфейс был меньше, и я мог отказаться от многих методов. Тем не менее, я в основном переместил реализацию многих методов в реализацию громоздкого одиночного метода. На какое-то время мне стало лучше. Я думал о переходе к подходу, который обернул бы метод громкого запроса в ряд отдельных объектов, где каждый объект обрабатывал специфику, и я призываю к результатам:

public abstract class QueryCommand
{
    protected IBlogReader reader = null;
    public QueryCommand(IBlogReader reader)
    {
        this.reader = reader;
    }

    public abstract void Execute();
}

public class GetLatest : QueryCommand
{
    public BlogPost GetResults();
    public void Execute();
}

public class FindByDate : QueryCommand
{
    public IEnumerable<BlogPost> GetResults();
    public void Execute();
}

Это все еще не правильно. Я читал о шаблоне репозитория и не понимаю, как он применяется. Мне казалось, что я все равно получу множество методов в конце. Данные хранятся в облаке. Использование шаблона спецификаций было бы слишком тяжелым, так как мое прочтение приведёт все записи к квалификации. В другой попытке я создал отдельные объекты DAO и обернул их внутри фасадного объекта, похожего на репозиторий. Конечный результат был таким же, как я начал со ... многими методами ... но репозиторий не выполнил всю работу.

Должен ли я просто позволить себе иметь много методов или множество объектов и справиться с этим?

Ответы [ 2 ]

0 голосов
/ 27 декабря 2012

Почему бы вам просто не выставить IQueryable<BlogPost>? Проблема, которую вы описываете, заключается именно в том, почему этот подход имеет смысл.

Вот ваш интерфейс, модифицированный:

public interface IBlogReader
{
    IQueryable<BlogPost> Posts { get; }
}

Тогда вы можете просто выполнить запросы:

IBlogReader myReader = new MyReader();
var latest = myReader.Posts.Last();
var posts = myReader.Posts.Where(x => x.Author == "John Smith");

и т. Д.

Обратите внимание, что уже существует множество решений для доступа к данным, которые поддерживают это приложение, таких как LINQ to SQL, Entity Framework или NHibernate.

0 голосов
/ 22 июля 2011

Похоже на Объект запроса . Иногда мы также используем его вариант:

public class Filter
{
    public DateTime? PostDate { get; set; }
    public DateTime? LastComment { get; set; }
    public string Author { get; set; }
}

И затем разрешение ненулевых критериев для фильтрации выражения.

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