如何将 Ninject 中的参数添加到已解析的依赖项中?
How do I add parameters in Ninject to a resolved dependency?
我正在使用 MVVM 模型创建一个 WPF
应用程序。作为程序的一部分,我正在创建一个 UserControl
,其中包含 UserControls
的 ItemsControl
,并链接了自己的 ViewModel。
代码如下所示;
List<IDataViewModel> viewModels = new List<IDataViewModel>();
foreach (var type in Enum.GetValues(typeof(DataModel)))
{
var tempVM = ViewModelLocator.Get<IDataViewModel>();
tempVM.Type = type;
viewModels.Add(tempVM);
}
有没有办法简写这个或将参数作为 .Get<> 调用的一部分传递?
编辑
我已经按照答案中的建议去查看工厂模式,并更新了我的代码如下:
工厂,Ninject-模块
public interface IViewModelFactory
{
IDataViewModel CreateDataViewModel(DataType type);
}
public class ViewModelModule : NinjectModule
{
public override void Load()
{
Bind<IDataViewModel>().To<DataViewModel>();
Bind<IViewModelFactory>().ToFactory();
}
}
上面的代码变成了;
foreach (var type in Enum.GetValues(typeof(DataModel)))
{
viewModels.Add(viewModelFactory.CreateDataViewModel(type));
}
第一次调用 Factory
似乎有效并创建了一个新的 ViewModel
,但是连续调用失败(也就是说似乎没有创建新的 ViewModels
),有什么我想念的吗?我在网上找不到太多内容,而且措辞不明确且包含语法错误。我从中获得最多的页面没有说明为什么会发生这种情况。我的工厂中是否需要多个“IDataViewModels”?
像这样;
public interface IViewModelFactory
{
IDataViewModel CreateDataViewModel1(AccountType type);
IDataViewModel CreateDataViewModel2(AccountType type);
IDataViewModel CreateDataViewModel3(AccountType type);
IDataViewModel CreateDataViewModel4(AccountType type);
}
第二次编辑
确保在向 Factory
Interface
CreateDataViewModel(var Variable)
添加变量时,在实际视图模型构造函数签名中反映此更改!我的新手错误!
可以这样通过构造函数注入传递参数:
var typeParam = new ConstructorArgument("type", type);
ViewModelLocator.Get<IDataViewModel>(typeParam);
但是我建议使用强类型工厂,而不是使用静态服务定位器,然后通过构造函数注入再次注入这个工厂。
我正在使用 MVVM 模型创建一个 WPF
应用程序。作为程序的一部分,我正在创建一个 UserControl
,其中包含 UserControls
的 ItemsControl
,并链接了自己的 ViewModel。
代码如下所示;
List<IDataViewModel> viewModels = new List<IDataViewModel>();
foreach (var type in Enum.GetValues(typeof(DataModel)))
{
var tempVM = ViewModelLocator.Get<IDataViewModel>();
tempVM.Type = type;
viewModels.Add(tempVM);
}
有没有办法简写这个或将参数作为 .Get<> 调用的一部分传递?
编辑
我已经按照答案中的建议去查看工厂模式,并更新了我的代码如下:
工厂,Ninject-模块
public interface IViewModelFactory
{
IDataViewModel CreateDataViewModel(DataType type);
}
public class ViewModelModule : NinjectModule
{
public override void Load()
{
Bind<IDataViewModel>().To<DataViewModel>();
Bind<IViewModelFactory>().ToFactory();
}
}
上面的代码变成了;
foreach (var type in Enum.GetValues(typeof(DataModel)))
{
viewModels.Add(viewModelFactory.CreateDataViewModel(type));
}
第一次调用 Factory
似乎有效并创建了一个新的 ViewModel
,但是连续调用失败(也就是说似乎没有创建新的 ViewModels
),有什么我想念的吗?我在网上找不到太多内容,而且措辞不明确且包含语法错误。我从中获得最多的页面没有说明为什么会发生这种情况。我的工厂中是否需要多个“IDataViewModels”?
像这样;
public interface IViewModelFactory
{
IDataViewModel CreateDataViewModel1(AccountType type);
IDataViewModel CreateDataViewModel2(AccountType type);
IDataViewModel CreateDataViewModel3(AccountType type);
IDataViewModel CreateDataViewModel4(AccountType type);
}
第二次编辑
确保在向 Factory
Interface
CreateDataViewModel(var Variable)
添加变量时,在实际视图模型构造函数签名中反映此更改!我的新手错误!
可以这样通过构造函数注入传递参数:
var typeParam = new ConstructorArgument("type", type);
ViewModelLocator.Get<IDataViewModel>(typeParam);
但是我建议使用强类型工厂,而不是使用静态服务定位器,然后通过构造函数注入再次注入这个工厂。