Ninject和MVVM的多重绑定和上下文绑定


  • 我有一个Interface,它在启动时从本地Json文件中获取数据(反序列化(此接口注入了3个功能
  • 使用Contextual Name Binding,所有3个功能都能正常运行,正如我所期望的那样,使用来自本地json文件的3个不同的设备配置
  • 当我想让我的MainView显示所有3个设备的设置时,我必须获取所有3个绑定,并将它们注入MainViewModel中,如下代码所示
  • 问题是MainViewModel没有从内核得到任何东西,因为我在绑定DeviceConfig时使用了.WhenParentNamed(devicename),当我删除它时,内核确实在数组中返回了3个实例
  • 我想知道是否有任何方法可以在不删除WhenParentNamed上下文绑定的情况下获得所有DeviceConfig实例。这是我的第一个在线问题,很抱歉我的英语不好,谢谢你的阅读
public interface IDeviceConfig 
{
int Param1 {get;set;}
int Param2 {get;set;}
...
}
internal class DeviceConfig : IDeviceConfig
{
int Param1
{
}
int Param2
{
}
...
}
public sealed partial class App : Application
{
var kernel = new StandardKernel();
var AllDevices = GetDeviceConfigFromJson();
if (AllDevices.Count > 0)
{
for (var i = 0; i < AllDevices.Count; i++)
{
var devicename = i.ToString();
kernel.Bind<IDeviceConfig>().ToConstant(AllDevices.ElementAt(i)).WhenParentNamed(devicename);
kernel.Bind<IFeature1>().To<Feature1>().Named(devicename);
kernel.Bind<IFeature2>().To<Feature2>().Named(devicename);
kernel.Bind<IFeature3>().To<Feature3>().Named(devicename);
//Each device has 3 features and all 3 features get property from DeviceConfig

//on startup all device get config and run
kernel.Get<IFeature1>(devicename);
kernel.Get<IFeature2>(devicename);
kernel.Get<IFeature3>(devicename);
}
}
kernel.Bind<MainViewModel>.ToSelf();
Current.MainWindow = kernel.Get<MainView>();
Current.MainWindow.Show();


}
public MainViewViewModel(IDeviceConfig[] devices)
{
ShowAllDevices(devices); // Mainview Binding Xaml to each Device's Config
}

我找到了一个丑陋的方法,但它有效!

kernel.Bind<IDeviceConfig>.ToConstant(AllDevices.ElementAt(i)).Named(devicename);
kernel.Bind<IFeature1>().To<Feature1>().InSingletonScope().WithConstructorArgument("config", kernel.Get<IDeviceConfig>(devicename))Named(devicename);
var feature1 = kernel.Get<IFeature1>(devicename);

最新更新