В настоящее время я использую 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);
}
Надеюсь, это имеет смысл.