c# - 使用 Ninject 跨类传递参数

标签 c# .net mvvm dependency-injection ninject

我对使用依赖项注入(inject)还很陌生,我正在我的 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看到可以在构造函数中传递额外的参数。

但是,我有一些顾虑:

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

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

最佳答案

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

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

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

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

关于c# - 使用 Ninject 跨类传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11025548/

相关文章:

.net - 确定泛型参数是否为 Nullable 类型

c# - 在 wpf 数据网格中动态添加复选框列

wpf - 可以对复合对象的字段进行数据绑定(bind)吗?

c# - 使用 mvvm 模型在 Windows Phone 中的 map 上显示多个图钉

c# - ASP.NET 线程 - 双重检查锁定

c# - for循环中的除法增量器?

c# - 在 WPF (C#) 中的两个 Datagrid 之间拖放

c# - 使用 TextBox 在 WPF slider 上呈现刻度数

.net - 构建自定义 "ClaimsAuthorizationManager"Windows Identity Foundation 类的好方法是什么?

c# - 等待句柄和 System.Threading.Tasks 命名空间