我目前正在使用Castle Windsor v2.5.1并遇到一些问题。我有一个列表,用户可以选择自己选择的项目并开始处理所选项目。选择项目后,我会在编辑器视图模型中注入构建的项目并将其显示给最终用户。我已将所有依赖项设置为具有瞬态生活方式,这使我处理注入单例依赖项,从而使我从先前加载的项而不是新对象中获取过时数据。
以下是我的视图模型构造函数的样子:
public TabViewModel(
IRepository repository
IEditorViewModelFactory editorViewModelFactory)
{
在此应用程序的生命周期内只创建了此类的一个实例,这很好。但是,由于用户可以(并且确实)在应用程序的整个生命周期中选择许多不同的项目,因此我最终使用相同的依赖项。每次在TabViewModel
视图中选择新项目时,我都会调用editorViewModelFactory.Create(the id of the item selected)
。由于只创建了IEditorViewModelFactory
的一个实例,因此Windsor不会注入新的依赖关系。
如果加载新项目,我如何强制Windsor注入一组新的依赖项?
该应用程序的工作原理如下。当应用程序加载它打开时,它会打开与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>());
}
}
希望这能澄清我的问题。
每次选择一个项目时,我都会使用我的审阅服务来确定用户是否符合资格。在确定资格时,我会检索所选项目的所有当前评论。审核某个项目时,我的审核处理程序会根据确定用户资格收集的评论进行处理。这意味着,通过始终具有相同的审阅服务实例,所有先前从其他项目检索的评论都在系统中挥之不去。通过在找到用户资格时清除我的评论列表,我能够解决这个问题。这是有效的,因为当加载编辑器时,首先发生的事情是确定用户是否符合条件。
以下是我所指的两个接口:
public interface IReviewingService
{
ReviewEligibilityResult GetReviewEligibility(ItemViewModel itemViewModel);
void Save(UserReview userReview);
}
public interface IReviewProcessor
{
void Process(UserReview userReview, IList<ReviewDto> reviews);
}
希望这是有道理的。
答案 0 :(得分:3)
内存中只有一个EditorViewModelFactory
实例,因为它被配置为Singleton。因此,因为它通过IRepository
字段保留_repository
实例,所以内存中只有这些实例,无论其生命周期如何配置
但是,Create
方法每次都返回EditorViewModel
的新实例,但_repository
实例仍然相同,并且正在传递到EditorViewModel
实例
如果您每次创建IRepository
的实例时都需要EditorViewModel
的新实例,则可以use an Abstract Factory。