一、目的:
Microsoft.Extensions.Options 是 .NET Core 中用于处理配置选项的一个库。它提供了一种强类型的方式来读取和绑定配置数据(例如来自 appsettings.json 文件、环境变量或其他配置源的数据),并将其注入到应用程序中。这个库是 .NET Core 的一部分,但也可以在 .NET Framework 或其他 .NET 实现中使用。
需要添加:Microsoft.Extensions.Options.ConfigurationExtensions 包
核心概念
• 选项模式:选项模式使用类来表示配置数据的分组。这些类通常是简单的 POCO(Plain Old CLR Objects),包含一些属性,这些属性对应于配置数据的键。
• IOptions:IOptions<T> 接口用于访问 T 类型的配置数据。当你注册了 T 类型的配置数据后,可以通过依赖注入在应用程序的其他部分访问这些数据。
• IOptionsSnapshot:IOptionsSnapshot<T> 适用于需要在应用程序运行时重新加载配置数据的场景。它在每个请求时提供配置数据的新快照。
• IOptionsMonitor:IOptionsMonitor<T> 用于实时监控配置数据的变化。它提供了一个变更通知事件,可以在配置数据发生变化时触发。
二、示例:
假设你有一个 appsettings.json 配置文件,其中包含了一些应用程序设置:
{
"MySettings": {
"SettingA": "value1",
"SettingB": "value2"
}
}
首先,定义一个类来表示这些设置:
public class MySettings
{
public string SettingA { get; set; }
public string SettingB { get; set; }
}
然后,在 Startup.cs 的 ConfigureServices 方法中注册这个配置类:
public void ConfigureServices(IServiceCollection services)
{
// 绑定配置
services.Configure<MySettings>(Configuration.GetSection("MySettings"));
// 其他服务注册...
}
现在,你可以在需要的地方通过依赖注入来访问这些设置:
public class MyService
{
private readonly MySettings _mySettings;
public MyService(IOptions<MySettings> options)
{
_mySettings = options.Value;
}
public void DoSomething()
{
Console.WriteLine(_mySettings.SettingA);
// 使用 _mySettings...
}
}
Microsoft.Extensions.Options 提供了一种简单而强大的方式来管理和访问应用程序的配置数据。通过使用强类型的配置类和依赖注入,你可以轻松地将配置数据集成到你的应用程序中,同时保持代码的清晰和可维护性。
Winform作为桌面应用程序的一个代表,可以说是C#初学者快速入门最好的一种方式,然而随着我们的开发能力的提升,我们对UI界面的要求变得越来越高,于是我们开始不断优化、升级我们的UI界面。
Winform无边框设计是我们常用的一种方式,无边框设计意味着没有了应用程序的标题栏,也就无法直接拖动,今天主要介绍两种实现无边框拖动的方式。
第一种方式:代码实现
Point mPoint;
private void Panel_MouseDown(object sender, MouseEventArgs e)
{
mPoint = new Point(e.X, e.Y);
}
private void Panel_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
this.Location = new Point(this.Location.X + e.X - mPoint.X, this.Location.Y + e.Y - mPoint.Y);
}
}
this.MouseDown += Form_MouseDown;
this.MouseUp += Form_MouseUp;
this.MouseMove += Form_MouseMove;
这种方式使用的是自己写代码实现,将这段代码复制到界面代码中,然后选择窗体中的一个控件,比如Panel或者Label,将它们的MouseDown事件绑定代码中的MouseDown事件,MouseMove事件绑定代码中的MouseMove事件,即可。
第二种方式:Windows API
[DllImport("user32.dll")]
public static extern bool ReleaseCapture();
[DllImport("user32.dll")]
public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
public const int WM_SYSCOMMAND = 0x0112;
public const int SC_MOVE = 0xF010;
public const int HTCAPTION = 0x0002;
private void TopPanel_MouseDown(object sender, MouseEventArgs e)
{
ReleaseCapture();
SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
}
这种方式使用的是Windows底层的API函数,同样将这段代码复制到界面代码中,然后选择窗体中的一个控件,比如Panel或者Label,将它们的MouseDown事件绑定代码中的MouseDown事件,即可。
using System.Net;
String hostInfo =Dns.GetHostName();//获取本机的计算机名
this.ComputerTextBox.Text = hostInfo;
System.Net.IPAddress addr;
addr = new System.Net.IPAddress(Dns.GetHostByName(Dns.GetHostName()).AddressList[0].Address);
String IPAddress = addr.ToString();//获取本机的IP地址
this.ipTextBox.Text = IPAddress;
private static IEnumerable<string> GetCommandLines(string processName)
{
List<string> results = new List<string>();
string wmiQuery = string.Format("select CommandLine from Win32_Process where Name='{0}'", processName);
using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(wmiQuery))
{
using (ManagementObjectCollection retObjectCollection = searcher.Get())
{
foreach (ManagementObject retObject in retObjectCollection)
{
results.Add((string)retObject["CommandLine"]);
}
}
}
return results;
}
static void Main(string[] args)
{
var result = GetCommandLines("msvsmon.exe");
Console.Read();
}
任务管理器中实际的参数如下, 该程序或得到3个item的string。