我是使用依赖注入的新手,我在我的WPF应用程序中尝试使用Ninject。我想知道如何跨类传递参数。
例如
public class ViewPersonViewModel : ViewModelBase
{
private IDataAccessService _dataService;
private IPerson _person;
private string _remarks;
// binded to textbox
public string Remarks
{
get { return _remarks; }
set {
if (_remarks != value) {
remarks = value;
OnPropertyChanged("Remarks");
}
}
}
public ViewPersonViewModel(
IDataAccessService dataService, IPerson person)
{
_dataService= dataService;
_person = person;
}
// binded to Button
public void RetrieveStatus()
{
Remarks = _dataService.RetrieveRemarks(_person);
}
}
在这里,dataService是一个固定的类,我可能会这样做
class Module : Ninject.Modules.NinjectModule
{
public override void Load()
{
Bind<IDataAccessService>().To<DefaultDataAccessService>();
}
}
但我想知道如何处理person参数,它由调用类设置。
我从Creating an instance using Ninject with additional parameters in the constructor看到可以在构造函数中传递其他参数。
但是,我有一些顾虑:
使用kernel.Get<MyClass>( With.Parameters.ConstructorArgument( "parameterName", parameterValue) );
是理想的方法吗?它不会在调试中造成很多问题,例如当您错误地键入parameterName
时?
Ruben还提到了如何使用更复杂的方式来处理Provider。它适用于此吗?如果是,我该如何使用它?
答案 0 :(得分:0)
你可能会考虑做的是像这样重载构造函数:
public ViewPersonViewModel(IPerson person)
this(DependencyResolver.GetInstance<IDataAccessService>(), person)
{
}
public ViewPersonViewModel(
IDataAccessService dataService, IPerson person)
{
_dataService= dataService;
_person = person;
}
这方面的主要缺点是您不能直接通过IoC请求ViewPersonViewModel。
答案 1 :(得分:0)
Ninject 3提供了一个方便的功能,允许我跨类传递参数。通过创建类似
的界面public interface IViewPersonViewModelFactory()
{
IViewPersonViewModel CreateViewPersonViewModel([parameterType parameterName..]);
}
并将以下内容添加到要加载的Ninject模块中:
public override void Load()
{
Bind<IMainControllingViewModelFactory>().ToFactory();
... ... //other bindings
}
然后我们可以获取ViewPersonViewModel类的实例(例如在MainViewModel类中)
public class MainViewModel
{
private IViewPersonViewModel _viewModel;
public MainViewModel(IViewPersonViewModelFactory viewModelFactory)
{
_viewModel = viewModelFactory.CreateViewPersonViewModel(parameters..);
}
}
请注意,不必创建具体工厂。
维基可以在https://github.com/ninject/ninject.extensions.factory/wiki/Factory-interface
找到