让孩子.NET中使用DiagnosticSource?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
创新互联建站是一家专业提供栾川企业网站建设,专注与网站制作、成都网站制作、H5场景定制、小程序制作等业务。10年已为栾川众多企业、政府机构等服务。创新互联专业的建站公司优惠进行中。DiagnosticSource是一个非常有意思的且非常有用的API,对于这些API它们允许不同的库发送命名事件,并且它们也允许应用程序订阅这些事件并处理它们,它使我们的消费者可以在运行时动态发现数据源并且订阅与其相关的数据源。
DiagnosticSource在AspNetCore、EntityFrameworkCore、HttpClient、SqlClient中被使用,在我们实际的开发过程中他使我们能够进行拦截请求与响应的http请求、数据库查询、对HttpContext、DbConnection、DbCommand、HttpRequestMessageand等对象的访问,甚至说在需要的时候我们可以进行修改这些对象来处理我们的业务。
下面我们将通过如下的简单示例来了解它.
DiagnosticSource和EventSource区别
DiagnosticSource和EventSource在架构设计上很相似,他们的主要区别是EventSource它记录的数据是可序列化的数据,会被进程外消费,所以要求记录的对象必须是可以被序列化的。而DiagnosticSource被设计为在进程内处理数据,所以我们通过它拿到的数据信息会比较丰富一些,它支持非序列化的对象,比如HttpContext、HttpResponseMessage等。另外如果想在EventSource中获取DiagnosticSource中的事件数据,可以通过DiagnosticSourceEventSource这个对象来进行数据桥接。
需求来了
为了更好的理解DiagnosticSource的工作方式,如下这个示例将拦截数据库请求,假设我们有一个简单的控制台应用程序,它向数据库发出请求并将结果输出到控制台。
class Program { public const string ConnectionString = @"Server=localhost;Database=master;Trusted_Connection=True;"; static async Task Main(string[] args) { var result = await Get(); Console.WriteLine(result); } public static async TaskGet() { using (var connection=new SqlConnection(ConnectionString)) { return await connection.QuerySingleAsync ("SELECT 42;"); } } }