【发布时间】: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