每天我们使用很多NuGet包. 其中大多数都是众所周知的,并且需要安装,而其中一些是可选的. 如今,大多数“可选”软件包已成为工业标准,如NUnit或Newtonsoft.Json. 然而,开发人员不断开发新的软件,我们看到许多新的软件包出现在 NuGet Gallery.
在本文中,我们将回顾几个值得您注意的通用软件包.
我所说的“一般用途”是指您很可能会使用其中的一些软件包, 不管你在开发什么:一个web应用程序, 服务器端或桌面应用程序.
一种在ASP中执行即炒即忘、延迟和循环任务的简单方法.NET applications. No Windows Service required.
Fire-and-forget tasks:
//静态方法用于演示
BackgroundJob.Enqueue(
() => Console.WriteLine("Simple!"));
Delayed tasks:
BackgroundJob.Schedule(
() => Console.WriteLine("Reliable!"),
TimeSpan.FromDays(7));
Recurring tasks:
RecurringJob.AddOrUpdate(
() => Console.WriteLine("Transparent!"),
Cron.Daily);
一个更好的日期和时间API .NET.
乔恩出生于1976年6月19日(公历)。. 在英国时区,他现在多大了?
LocalDate birthDate = new LocalDate(1976,19);
DateTimeZone zone = DateTimeZoneProviders.Tzdb["Europe/London"];
ZonedClock时钟= SystemClock.Instance.InZone(zone);
LocalDate today = clock.GetCurrentLocalDateTime().Date;
Period age = Period.Between(birthDate, today);
Console.Jon的年龄是{0}年,{1}个月,{2}天.", age.Years, age.Months, age.Days);
UniRest是一组轻量级HTTP库,支持多种语言.
该库可用于所有保留相同API的主流语言. .. NET版本具有可移植库,几乎可以在所有设备上运行 .NET Framework versions.
一个基本的POST请求示例:
HttpResponse jsonResponse = Unirest.post("http://httpbin.org/post")
.标题(“接受”、“application / json”)
.field("parameter", "value")
.field("foo", "bar")
.asJson();
Shouldly是一个断言框架,它专注于在断言失败时给出巨大的错误消息,并且简单而简洁.
Assert.That(map.IndexOfValue("boo"), Is.EqualTo(2)); // -> Expected 2 but was 1
map.IndexOfValue("boo").ShouldBe(2); // -> map.IndexOfValue("boo")应该是2,但实际上是1
Lightweight .用于以编程方式生成Markdown的。NET组件. 用于生成具有最小依赖关系的丰富诊断日志.
var data = new[]
{
new{年份= 1991,专辑= "Out of Time",歌曲=11,评分= "* * * *"},
new{年份= 1992,专辑= "Automatic for the People",歌曲=12,评分= "* * * * *"},
new{年份= 1994,专辑= "Monster",歌曲=12首,评分= "* * *"}
};
Console.Write(data.ToMarkdownTable());
// Produces:
//
//年份|专辑|歌曲|评分
// ----:| ------------------------ | -----:| ---------
// 1991 |不合时宜| 11 | * * * *
// 1992 |自动为人民| 12 | * * * * *
// 1994 |怪物| 12 | * * *
ziplib是一个完全用c#编写的Zip, GZip, Tar和BZip2库 .NET platform.
How to create a Zip file:
FastZip = new FastZip();
bool recurse = true; // Include all files by recursing through the directory structure
string filter = @"\.txt$"; // Only files ending in ".txt"
fastZip.CreateZip("fileName., @"C:\SourceDirectory",递归,过滤器);
Humanizer meets all your .. NET需要操作和显示字符串, enums, dates, times, timespans, numbers and quantities.
一些不需要解释的例子:
DateTime.UtcNow.AddHours(-30).Humanize() => "yesterday"
DateTime.UtcNow.AddHours(-2).Humanize() => "2 hours ago"
TimeSpan.FromMilliseconds(1299630020).Humanize(4) => "2 weeks, 1 day, 1 hour, 30 seconds"
"string".Pluralize() => "strings"
"Men".Singularize() => "Man"
"man".ToQuantity(1) => "1 man"
通用图数据结构和算法 .NET.
最需要的特性是拓扑排序:
DataSet ds = new MyDataSet(); // your dataset
var graph = ds.ToGraph(); // wraps the dataset into a DataSetGraph
foreach(DataTable表在图中.TopologicalSort()) //对数据集图应用拓扑排序
Console.WriteLine(table.TableName); // in which order should we delete the tables?
EPPlus is a .. NET库,使用Open Office Xml格式(XLSX)读写Excel 2007/2010文件。.
这是一个如何在不访问文件系统的情况下从web服务器返回电子表格的示例.
private void DumpExcel(数据表)
{
使用(ExcelPackage pck = new ExcelPackage())
{
//Create the worksheet
ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Demo");
//加载数据表到工作表,从单元格A1开始. 打印第1行上的列名
ws.Cells["A1"].LoadFromDataTable(资源描述,真正的);
//设置1-3列的标题格式
using (ExcelRange rng = ws.Cells["A1:C1"])
{
rng.Style.Font.Bold = true;
}
//示例如何将列1格式化为数字
using (ExcelRange col = ws.Cells[2, 1, 2 + tbl.Rows.Count, 1])
{
col.Style.Numberformat.Format = "#,##0.00";
col.Style.excelhorizontalalign = excelhorizontalalign.Right;
}
//写回客户端
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AddHeader("content-disposition", "attachment; filename=ExcelDemo.xlsx");
Response.BinaryWrite(pck.GetAsByteArray());
}
}
It is a .NET代码库,允许您解析“来自web”的HTML文件. 解析器对“真实世界”的格式错误HTML非常宽容.
例如,以下是如何解决所有问题 href
tags in an HTML file:
HtmlDocument = new HtmlDocument();
doc.Load("file.htm");
HtmlNode链接在文档中.DocumentElement.SelectNodes("//a[@href"])
{
HtmlAttribute att = link["href"];
att.Value = FixLink(att);
}
doc.Save("file.htm");
的一个小验证库 .NET使用流畅接口和lambda表达式来构建验证规则.
Example:
using FluentValidation;
public class CustomerValidator: AbstractValidator {
公共CustomerValidator() {
RuleFor(customer => customer.Surname).NotEmpty();
RuleFor(customer => customer.Forename).NotEmpty().WithMessage("请指定名字");
RuleFor(customer => customer.Discount).NotEqual(0).When(customer => customer.HasDiscount);
RuleFor(customer => customer.Address).Length(20, 250);
RuleFor(customer => customer.Postcode).Must(BeAValidPostcode).WithMessage("请指定有效的邮政编码");
}
private bool BeAValidPostcode(string postcode) {
//自定义邮政编码验证逻辑在这里
}
}
Customer Customer = new Customer();
validator = new CustomerValidator();
ValidationResult结果=验证器.Validate(customer);
bool validationSucceeded =结果.IsValid;
IList failures = results.Errors;