点击关注不迷路,你的关注是我们最大的动力
持续讲解第十六天:2024-10-13 manyanedu 漫研教育
在wpf中怎么在应用中保存你的配置及用户信息,使用用户登录之后保存用户名的方式给大家讲解_哔哩哔哩_bilibili
为什么要讲这一节课
我们知道,系统在登录时,会拿到很多的需求全局使用的数据,如我们很多平台在右上解会显示用户名,有时也要根据用户的角色来判断用户的操作,所以我们要把用户登录之后的数据保存成全局,方便在其它的地方使用。
二、目前wpf中存储全局数据的几种常见方式
1、通过静态类或是静态属性
public static class GlobalSettings
{
public static string LoggedInUserName { get; set; }
}
我们在登录成功之后给这个静态类的字段赋值。如下
GlobalSettings.LoggedInUserName = "用户名";
在要使用的地方引用这个静态类,按如下方式引用
string userName = GlobalSettings.LoggedInUserName;
采用此种方式在项目中怎么实现?
第一步:创建一个用户服务类,后面可以把登录服务移到这个服务类里。
代码如下:
namespace MyAgvLesson.Common
{
public static class UserInfoService
{
public static string USER_NAME = "";
}
}
第二步:修改用户登录方法,代码如下:
private void LoginSave()
{
//会从数据库做判断
// MessageBox.Show($"用户名是:{_user?.UserName},密码是:{_user?.Password}");
if(_user==null||_user.UserName==null||_user.Password==null)
{
MessageBox.Show("用户名和密码不能为空");
return;
}
UserService userService = new UserService();
Tuple
if(res!=null)
{
//把用户名保存到这个UserInfoService里
UserInfoService.USER_NAME=res.Item2 as string;
//打开主窗体
MainWindow main = new MainWindow();
main.Show();
//通过事件关闭登录窗体
this.CloseWindowCommandExecuted();
}
else
{
MessageBox.Show("用户名或是密码错误");
}
}
第三步:创建MainWindow窗体,如果以前创建过,可以不用创建。代码如下
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:MyAgvLesson" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800">
第四步:修改MainWindow的隐藏文件
namespace MyAgvLesson
{
///
/// MainWindow.xaml 的交互逻辑
///
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
//设置mainwindow的数据上下文
DataContext = new MainWindowViewModel();
}
}
}
2、使用Application类的`Properties
我们在登录成功之后
Application.Current.Properties["LoggedInUserName"] = "用户名";
在需要的地方使用
string userName = Application.Current.Properties["LoggedInUserName"] as string;
if (userName != null)
{
// 使用用户名
}
3、使用文件存储,如果我们有时要求系统重启之后还要保留数据,可以使用这种方式,此方法后面会讲到
4、使用依赖注入的方式
如果我们有依赖注入框架,我们可以使用依赖注入的方式更灵活的获取,特别在单元测试里可以很方便的使用。我们可以建一个服务管理类,如下
public interface IUserService
{
string LoggedInUserName { get; }
}
public class UserService : IUserService
{
private string _loggedInUserName;
public string LoggedInUserName
{
get { return _loggedInUserName; }
set { _loggedInUserName = value; }
}
}
然后我们把他注入容器,之后在要使用的地方通过构造函数注入的方式注入。此方法非常重要,后面引入框架之后会着重讲。
public class SomeViewModel
{
private readonly IUserService _userService;
public SomeViewModel(IUserService userService)
{
_userService = userService;
}
public void SomeMethod()
{
string userName = _userService.LoggedInUserName;
// 使用用户名
}
}
三、几种方式的不同
选择哪种方法取决于你的应用程序的架构和需求。静态类和Application.Properties方法更简单直接,但可能不适合所有情况,特别是当涉及到单元测试或依赖注入时。依赖注入提供了更高的灵活性和可测试性,但可能需要更多的设置工作。
一个小作业
[!IMPORTANT]
先自己录音讲一下你在wpf中怎么存储系统的配置与用户数据的?
点击关注不迷路,你们的关注是我们最大的动力
这是面试中必问的一个问题,大家引起重视。
下一节课:mainwindow的主页的菜单布局设置。