从视图加载新项时,注入新的依赖项集

时间:2011-09-01 12:17:44

标签: wpf mvvm dependency-injection castle-windsor

我目前正在使用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>());
    }
}

希望这能澄清我的问题。

编辑2

每次选择一个项目时,我都会使用我的审阅服务来确定用户是否符合资格。在确定资格时,我会检索所选项目的所有当前评论。审核某个项目时,我的审核处理程序会根据确定用户资格收集的评论进行处理。这意味着,通过始终具有相同的审阅服务实例,所有先前从其他项目检索的评论都在系统中挥之不去。通过在找到用户资格时清除我的评论列表,我能够解决这个问题。这是有效的,因为当加载编辑器时,首先发生的事情是确定用户是否符合条件。

以下是我所指的两个接口:

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

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

希望这是有道理的。

1 个答案:

答案 0 :(得分:3)

内存中只有一个EditorViewModelFactory实例,因为它被配置为Singleton。因此,因为它通过IRepository字段保留_repository实例,所以内存中只有这些实例,无论其生命周期如何配置

但是,Create方法每次都返回EditorViewModel的新实例,但_repository实例仍然相同,并且正在传递到EditorViewModel实例

如果您每次创建IRepository的实例时都需要EditorViewModel的新实例,则可以use an Abstract Factory