Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 统一构造函数注入_C#_Wpf_Mvvm_Unity Container_Prism - Fatal编程技术网

C# 统一构造函数注入

C# 统一构造函数注入,c#,wpf,mvvm,unity-container,prism,C#,Wpf,Mvvm,Unity Container,Prism,我正在使用MVVM在wpf应用程序中使用Prism+Unity。我是一个棱镜和统一的初学者 我希望能够关闭当前视图。我读过的各种解决方案和文章指出,实现这一点的最佳方法是从视图模型。但是视图模型需要区域管理器对象才能关闭视图。好的,让我们设置构造函数注入。以前从未尝试过,但有很多问题需要解决 让我先解释一下事物是如何联系在一起的。我有一个bootstrapper类来处理类型和实例的注册 以下是我的视图和视图模型的注册方式: container.RegisterType<IViewModel

我正在使用MVVM在wpf应用程序中使用Prism+Unity。我是一个棱镜和统一的初学者

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

让我先解释一下事物是如何联系在一起的。我有一个bootstrapper类来处理类型和实例的注册

以下是我的视图和视图模型的注册方式:

container.RegisterType<IViewModel, ViewAccountsViewModel>(new InjectionConstructor(new ResolvedParameter(typeof(RegionManager))));
container.RegisterType<ViewAccountsView>();
编译解决方案时,我收到一个错误,即类型“viewcountsviewmodel”不包含任何可访问的构造函数。如果向视图模型中添加默认构造函数,则会显示视图,但无法从区域中删除视图。我得到一个参数null异常

以下是删除视图的代码:

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

我仍然是国际奥委会和DI的初学者。我遗漏了什么吗?

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>();
查看隐藏代码:

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

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>();
查看隐藏代码:

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

添加默认构造函数并在此构造函数上放置断点。如果这能起作用(在断点处停止),那么您的注册就会出现问题(如果所有需要的对象都已注册,请检查它们)。如果我更改为
container.RegisterType(),我想添加这一点我的视图显示,但我无法删除该视图。未调用我的重载构造函数。请添加默认构造函数并在此构造函数上放置断点。如果这能起作用(在断点处停止),那么您的注册就会出现问题(如果所有需要的对象都已注册,请检查它们)。如果我更改为
container.RegisterType(),我想添加这一点我的视图显示,但我无法删除该视图。我的重载构造函数没有被调用。
// 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;
}