Путаница по поводу IRepository - PullRequest
2 голосов
/ 13 сентября 2010

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

В настоящее время у меня есть что-то вроде этого:

public class MainViewModel : ViewModelBase
{
    // EF4 generated ObjectContext 
    private ScorBotEntities context = new ScorBotEntities();         

    // Custom IUserRepository class
    private IUserRepository userRepository;

    public MainViewModel()
    {
        this.userRepository = new UserRepository(context.Users);
    }

    public ObservableCollection<User> Users
    {
        get
        {
            return new ObservableCollection<User>(userRepository.GetAll());
        }
    }
}

ScorBotEntities автоматическииспользуя EF4 (я посмотрел на POCO, чтобы много работать для этого масштабного проекта).

Вы можете найти определение UserRepository здесь: http://code.google.com/p/i4prj4-g2/source/browse/ScorBotRobotics/ScorBotRobotics/Repositories/UserRepository.cs

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

public class MainViewModel : ViewModelBase
{
    private ScorBotEntities context = new ScorBotEntities();         

    public MainViewModel()
    {
    }

    public ObservableCollection<User> Users
    {
        get
        {
            return new ObservableCollection<User>(context.Users);
        }
    }
}

Имеет смысл абстрагировать функциональность, например, с помощью метода UsernameAndPassword.Но в этом случае, возможно, использование некоторых объектов Query было бы более идеальным?

Ответы [ 3 ]

2 голосов
/ 13 сентября 2010

Я немного сбит с толку, что ваш контекст дошел до вашей ViewModel.Я считаю, ваш уровень GUI никогда не должен видеть контекст .Контекст должен быть открыт / сохранен / закрыт с помощью IRepository.Пусть слой данных (IRepository) возвращает массив / список Users.

2 голосов
/ 13 сентября 2010

Здесь есть несколько разных моментов.Во-первых, ваши модели представлений не должны знать о хранилище - сохраняйте ваши модели представлений как можно более простыми.

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

Существует несколько различных (совершенно приемлемых способов) реализации IRepository.Во-первых, репозиторий должен инкапсулировать контекст напрямую.Другой способ - использовать шаблон «единицы работы», чтобы ваш unitOfWork инкапсулировал контекст и передавал объект unitOfWork в каждый репозиторий.В любом случае, поскольку вы используете EF4, тестируемость намного проще, чем раньше.Например, EF4 представила IObjectSet , чтобы было легко предоставлять тестовые дубликаты и макеты для тестирования вашего хранилища.

Я настоятельно рекомендую ознакомиться с этим техническим документом на Testability and Entity Framework 4.

1 голос
/ 13 сентября 2010

Разделение интересов

Что если вы захотите изменить хранилище 'Users', скажем, SQL, на простой файл?

Тогда context будетв этом нет необходимости, и вам придется менять каждое его использование, а не только вашу IRepository реализацию.

Кроме того, в идеале вам нужно было бы сделать инъекцию IRepository.Так что вам MainViewModel все равно, как оно получается Users.

...