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