【问题标题】:How to bind one singleton instance in ninject to multiple bind methods如何将ninject中的一个单例实例绑定到多个绑定方法
【发布时间】:2019-09-26 20:17:47
【问题描述】:

使用 MVVM 框架和 Ninject,我有不同的具体 ViewModel 类都绑定到 IViewModel 接口。我的问题是希望在如何确定将哪个 ViewModel 注入视图方面具有一定的灵活性。我希望能够使用Named(string)attribute、ConstraintAttribute 或基本Attribute 来确定正确的 ViewModel

或者换句话说,我希望所有这些都返回一个单例 AlphaViewModel 实例:

Bind<IViewModel>().To<AlphaViewModel>().WhenTargetHas<AlphaAttribute>();
Bind<IViewModel>().To<AlphaViewModel>().WhenMemberHas<AlphaAttribute>();
Bind<IViewModel>().To<AlphaViewModel>().WhenClassHas<AlphaAttribute>();

Bind<IViewModel>().To<AlphaViewModel>().Named("Alpha");

Bind<IViewModel>().To<AlphaViewModel>().WhenInjectedInto<AlphaView>();

我试过了

A) Bind<IViewModel>().To<AlphaViewModel>().WhenInjectedInto<AlphaView>().InSingletonScope().Named("Alpha");
B) Bind<IViewModel>().To<AlphaViewModel>().WhenClassHas<AlphaAttribute>().InSingletonScope.Named("Alpha");

和类似的组合,但它似乎使要求更加复杂。


A 只有在其设置如下时才会进行正确的注入:
public partial class AlphaView : Window
{
    public AlphaView()
    {
        InitializeComponent();
    }
    public AlphaView([Named("Alpha")]IViewModel viewModel) : this()
    {
        DataContext = viewModel;
    }
}

B 有更多的余地,可以将 View 命名为其他名称,但它仍然需要两个参数来注入 ViewModel:

[AlphaAttribute]
public partial class BravoView : Window
{
    public BravoView()
    {
        InitializeComponent();
    }
    public BravoView([Named("Alpha")]IViewModel viewModel) : this()
    {
        DataContext = viewModel;
    }
}


当我想要的是能够使用任何一个属性或名称注入单例 AlphaViewModel 时,这样所有 3 个实例都可以使用并指向同一个 ViewModel。
[AlphaAttribute]
public partial class CharlieView : Window
{
    public CharlieView()
    {
        InitializeComponent();
    }
    public CharlieView(IViewModel viewModel) : this()
    {
        DataContext = viewModel;
    }
}

public partial class CharlieView : Window
{
    public CharlieView()
    {
        InitializeComponent();
    }
    public CharlieView([Named("Alpha")]IViewModel viewModel) : this()
    {
        DataContext = viewModel;
    }
}

public partial class CharlieView : Window
{
    public CharlieView()
    {
        InitializeComponent();
    }
    [AlphaAttribute]
    public IViewModel AlphaVM { get; set; }
}

【问题讨论】:

    标签: c# dependency-injection inversion-of-control ninject


    【解决方案1】:

    这可以通过为AlphaViewModel 单独绑定来实现

    Bind<AlphaViewModel>().ToSelf().InSingletonScope();
    

    并且 n 绑定将请求“重定向”到AlphaViewModel,例如:

    Bind<IViewModel>()
        .ToMethod(ctx => ctx.Kernel.Get<AlphaViewModel>())
        .WhenTargetHas<AlphaAttribute>();
    
    ...
    
    Bind<IViewModel>()
        .ToMethod(ctx => ctx.Kernel.Get<AlphaViewModel>())
        .Named("Alpha");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-24
      • 2021-09-17
      • 1970-01-01
      • 2021-05-02
      • 1970-01-01
      • 2018-02-28
      相关资源
      最近更新 更多