3

我对使用依赖注入非常陌生,我正在我的 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 参数,它是由调用类设置的。

我从在构造函数中使用带有附加参数的 Ninject 创建实例中看到,可以在构造函数中传递附加参数。

但是,我有几个担忧:

  1. 是用 kernel.Get<MyClass>( With.Parameters.ConstructorArgument( "parameterName", parameterValue) );理想的方式吗?它不会在调试中引起很多问题,例如您输入parameterName错误吗?

  2. Ruben 还提到了在涉及 Provider 的情况下使用更复杂的方式。在这里适用吗?如果是,我该如何使用它?

4

2 回答 2

0

您可能会考虑做的是像这样重载构造函数:

public ViewPersonViewModel(IPerson person)
    this(DependencyResolver.GetInstance<IDataAccessService>(), person)
{
}

public ViewPersonViewModel(
    IDataAccessService dataService, IPerson person)
{
    _dataService= dataService;
    _person = person;
}

这样做的主要缺点是您不能直接通过 IoC 请求 ViewPersonViewModel。

于 2012-06-18T17:10:08.797 回答
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..);
     }
 }

请注意,不必创建具体工厂。

可以在以下位置找到 wiki:https ://github.com/ninject/ninject.extensions.factory/wiki/Factory-interface

于 2012-06-19T01:30:36.783 回答