Unity构造函数注入

 A-Alon_586 发布于 2023-01-30 12:56

我在使用MVVM的wpf应用程序中使用Prism + Unity。我是Prism和Unity的初学者。

我希望能够关闭当前视图。我读过的各种解决方案和文章都指出,做到这一点的最佳方法是从视图模型中进行。但是视图模型需要一个区域管理器对象才能关闭视图。好的,让我们设置构造函数注入。以前从未尝试过,但是关于SO的问题很多。

首先让我解释一下如何将事物连接在一起。我有一个引导程序类,用于处理类型和实例的注册。

这是我的视图模型的注册方式:

container.RegisterType(new InjectionConstructor(new ResolvedParameter(typeof(RegionManager))));
container.RegisterType();

这是视图帐户视图的模块:

public class ViewAccountsModule : IModule
{
    private readonly IRegionManager regionManager;
    private readonly IUnityContainer container;

    public ViewAccountsModule(IUnityContainer container, IRegionManager regionManager)
    {
        this.container = container;
        this.regionManager = regionManager;
    }

    /// 
    /// 
    /// 
    public void Initialize()
    {
        regionManager.RegisterViewWithRegion("MainRegion", () => this.container.Resolve());
    }
}

在我的ViewAccountsView.xaml中,我像这样设置数据上下文:


    

而我的视图模型构造函数:

[InjectionConstructor]
public ViewAccountsViewModel(IRegionManager regionManager)
{
    if (regionManager == null) throw new ArgumentNullException("regionManager");

    this.regionManager = regionManager;
}

编译解决方案时,收到错误消息“ ViewAccountsViewModel”类型不包含任何可访问的构造函数。如果将默认构造函数添加到视图模型中,则会显示该视图,但无法从区域中删除该视图。我收到一个参数null异常。

这是删除视图的代码:

regionManager.Regions["MainRegion"].Remove(regionManager.Regions["MainRegion"].GetView("ViewAccountsView"));

我仍然是IoC和DI的初学者。有什么我想念的吗?

1 个回答
  • Unity将为您注入所有它知道的依赖项。默认情况下,Unity将使用最多的参数调用构造函数。通常,您可以使用InjectionConstructor告诉Unity在为您创建对象时选择其他构造函数,或者如果您想向其传递自定义参数。

    注册:

    container.RegisterType<IViewModel, ViewAccountsViewModel>();
    // If you plan to have multiple IViewModels, it will need to have a name
    // container.RegisterType<IViewModel, ViewAccountsViewModel>("ViewAccountsViewModelName");
    container.RegisterType<ViewAccountsView>();
    

    ViewModel:

    // If you decide later you need other dependencies like IUnityContainer, you can just set 
    // it in your constructor and Unity will give it to you automagically through the power 
    // of Dependency Injection
    // public ViewAccountsViewModel(IRegionManager regionManager, IUnityContainer unityContainer)
    public ViewAccountsViewModel(IRegionManager regionManager)
    {
        this.regionManager = regionManager;
    }
    

    查看后面的代码:

    // If you have a named IViewModel
    // public ViewAccountsView([Dependency("ViewAccountsViewModelName")]IViewModel viewModel)
    public ViewAccountsView(IViewModel viewModel)
    {
        this.InitializeComponent();
        this.DataContext = viewModel;
    }
    

    2023-01-30 12:58 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有