Catel 身份验证 + MahApps
Catel authentication + MahApps
我目前正在使用 MahApps Metro 学习 Catel+Orchestra。
我正在使用 MetroUI 从 Catel.Examples 项目中执行身份验证示例。
我的问题是当我在 MahAppsService
中创建一个新的 MainWindow 时
public FrameworkElement GetMainView()
{
return new MainWindow();
}
从未调用 MainWindowViewModel 的构造函数
public MainWindowViewModel(UIVisualizerService uiVisualizarService, IAuthenticationProvider authenticationProvider)
{
_uiVisualizerService = uiVisualizarService;
_authenticationProvider = authenticationProvider;
RoleCollection = new ObservableCollection<string>(new[] { "Read-Only", "Administrator" });
ShowView = new Command(OnShowViewExecute, OnShowViewCanExecute, "ShowView");
}
我已将其缩小到构造函数的 2 个依赖项。如果我删除 UIVisualizerService 和 IAuthenticacionProvider 依赖项,构造函数将被正确调用,但 ModelView 稍后需要这两个服务。
我不知道我该怎么做才能让它工作。
您必须在 ServiceLocator 中注册 IAuthenticationProvider:
var serviceLocator = ServiceLocator.Default;
serviceLocator.RegisterType<IAuthenticationProvider, MyAuthenticationProvider>();
请注意,Catel 内的所有服务都会自动为您注册,但您必须自己注册自己的服务(例如,通过使用 ModuleInit 或程序集中的其他入口点)。
我通过将视图模型显式注入到主窗口构造函数中解决了这个问题。
public MainWindow(MainWindowViewModel _mainwindowviewmodel):base(_mainwindowviewmodel)
{
InitializeComponent();
}
正在为 MahAppsService 的 AuthenticationProvider 接口声明字段 class。
private readonly IAuthenticationProvider _authenticationProvider;
同时在构造函数中添加AuthenticationProvider接口的依赖。
public MahAppsService(ICommandManager commandManager, IMessageService messageService, IUIVisualizerService uiVisualizerService, IAuthenticationProvider authenticationProvicer)
{
Argument.IsNotNull(() => commandManager);
Argument.IsNotNull(() => messageService);
Argument.IsNotNull(() => uiVisualizerService);
Argument.IsNotNull(() => authenticationProvicer);
_commandManager = commandManager;
_messageService = messageService;
_uiVisualizerService = uiVisualizerService;
_authenticationProvider = authenticationProvicer;
}
最后一步是在 MahAppsService 的 GetMainView 中创建视图模型的实例 class。
public FrameworkElement GetMainView()
{
var mainwindowViewModel = TypeFactory.Default.CreateInstanceWithParametersAndAutoCompletion<MainWindowViewModel>(_uiVisualizerService, _authenticationProvider);
return new MainWindow(mainwindowViewModel);
}
请注意,这可能不是最好的方法,但可以完成工作。如果谁有更好的方法欢迎分享。
我目前正在使用 MahApps Metro 学习 Catel+Orchestra。 我正在使用 MetroUI 从 Catel.Examples 项目中执行身份验证示例。 我的问题是当我在 MahAppsService
中创建一个新的 MainWindow 时 public FrameworkElement GetMainView()
{
return new MainWindow();
}
从未调用 MainWindowViewModel 的构造函数
public MainWindowViewModel(UIVisualizerService uiVisualizarService, IAuthenticationProvider authenticationProvider)
{
_uiVisualizerService = uiVisualizarService;
_authenticationProvider = authenticationProvider;
RoleCollection = new ObservableCollection<string>(new[] { "Read-Only", "Administrator" });
ShowView = new Command(OnShowViewExecute, OnShowViewCanExecute, "ShowView");
}
我已将其缩小到构造函数的 2 个依赖项。如果我删除 UIVisualizerService 和 IAuthenticacionProvider 依赖项,构造函数将被正确调用,但 ModelView 稍后需要这两个服务。
我不知道我该怎么做才能让它工作。
您必须在 ServiceLocator 中注册 IAuthenticationProvider:
var serviceLocator = ServiceLocator.Default;
serviceLocator.RegisterType<IAuthenticationProvider, MyAuthenticationProvider>();
请注意,Catel 内的所有服务都会自动为您注册,但您必须自己注册自己的服务(例如,通过使用 ModuleInit 或程序集中的其他入口点)。
我通过将视图模型显式注入到主窗口构造函数中解决了这个问题。
public MainWindow(MainWindowViewModel _mainwindowviewmodel):base(_mainwindowviewmodel)
{
InitializeComponent();
}
正在为 MahAppsService 的 AuthenticationProvider 接口声明字段 class。
private readonly IAuthenticationProvider _authenticationProvider;
同时在构造函数中添加AuthenticationProvider接口的依赖。
public MahAppsService(ICommandManager commandManager, IMessageService messageService, IUIVisualizerService uiVisualizerService, IAuthenticationProvider authenticationProvicer)
{
Argument.IsNotNull(() => commandManager);
Argument.IsNotNull(() => messageService);
Argument.IsNotNull(() => uiVisualizerService);
Argument.IsNotNull(() => authenticationProvicer);
_commandManager = commandManager;
_messageService = messageService;
_uiVisualizerService = uiVisualizerService;
_authenticationProvider = authenticationProvicer;
}
最后一步是在 MahAppsService 的 GetMainView 中创建视图模型的实例 class。
public FrameworkElement GetMainView()
{
var mainwindowViewModel = TypeFactory.Default.CreateInstanceWithParametersAndAutoCompletion<MainWindowViewModel>(_uiVisualizerService, _authenticationProvider);
return new MainWindow(mainwindowViewModel);
}
请注意,这可能不是最好的方法,但可以完成工作。如果谁有更好的方法欢迎分享。