Вставить новый набор зависимостей, когда новый элемент загружен из представления - PullRequest
3 голосов
/ 01 сентября 2011

В настоящее время я использую Castle Windsor v2.5.1 и сталкиваюсь с несколькими проблемами. У меня есть список, где пользователи выбирают элемент по своему выбору и начинают работать над выбранным элементом. Когда элемент выбран, я внедряю встроенный элемент в модель представления моего редактора и отображаю его для конечного пользователя. Я установил для всех своих зависимостей переходный образ жизни, что заставляет меня иметь дело с вводом одноэлементных зависимостей, оставляя мне устаревшие данные из ранее загруженного элемента вместо нового объекта.

Вот как выглядит мой конструктор модели вида:

public TabViewModel(
    IRepository repository 
    IEditorViewModelFactory editorViewModelFactory)
{

Только один экземпляр этого класса когда-либо создавался в течение времени жизни этого приложения, и это нормально. Но так как пользователи могут (и могут) выбирать много разных элементов в течение всего жизненного цикла приложения, я использую одни и те же зависимости. Каждый раз, когда в представлении TabViewModel выбирается новый элемент, я звоню editorViewModelFactory.Create(the id of the item selected). Поскольку создается только один экземпляр IEditorViewModelFactory, имеет смысл, что Виндзор не вводит новые зависимости.

Как заставить Виндзор вставлять новый набор зависимостей при загрузке нового элемента?

Редактировать

Приложение работает следующим образом. Когда приложение загружается, оно открывается, оно открывает представление, связанное с классом TabViewModel, и внедряет обе его зависимости. Только один экземпляр TabViewModel когда-либо создан. Внутри этого объекта TabViewModel я подключаюсь к свойству IsSelected из TreeViewItem (все элементы хранятся в виде дерева. Когда элемент выбран, запускается следующее событие из TabViewModel. Я получаю выбранный элемент и загрузить соответствующий редактор из моего введенного IEditorViewModelFactory.

private void OnItemSelected(object sender, PropertyChangedEventArgs e)
{
    const string isSelected = "IsSelected";
    var selectedItem = sender as ItemViewModelTiny;

    if (e.PropertyName == isSelected && selectedItem.IsSelected)
    {
        _editorViewModelFactory.Create(selectedItem.Id);
    }
}

Поскольку создается только один TabViewModel, то имеет смысл создать только один IEditorViewModelFactory. Таким образом, несмотря на то, что я продолжаю вызывать Create(), когда элемент выбран, он использует те же зависимости, которые были созданы при загрузке первого элемента.

Моя фабрика выглядит следующим образом:

public class EditorViewModelFactory : IEditorViewModelFactory
{
    private readonly IRepository _repository;

    public EditorViewModelFactory(IRepository repository)
    {
        _repository = repository;
    }

    public LocateEditorViewModel Create(int itemId)
    {
        var fullItem = _repository.GetFullItem(itemId);

        return new EditorViewModel(_repository, fullItem.MapTo<ItemViewModel>());
    }
}

Надеюсь, это прояснит мой вопрос.

Редактировать 2

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

Вот оба интерфейса, на которые я ссылаюсь:

public interface IReviewingService
{
    ReviewEligibilityResult GetReviewEligibility(ItemViewModel itemViewModel);
    void Save(UserReview userReview);
}

public interface IReviewProcessor
{
    void Process(UserReview userReview, IList<ReviewDto> reviews);
}

Надеюсь, это имеет смысл.

1 Ответ

3 голосов
/ 01 сентября 2011

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

Однако метод Create каждый раз возвращает новый экземпляр EditorViewModel, но экземпляр _repository остается тем же и передается в экземпляр EditorViewModel.

Если вам нужен новый экземпляр IRepository каждый раз, когда вы создаете экземпляр EditorViewModel, вы можете использовать Абстрактную фабрику .

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