使用方法

时间:2018-11-06 12:19:41

标签: c# nlog

假设您使用映射的诊断上下文使用代码并使用代码:

public string TransformTruTopsFABExport(string xmlFile) {
var xml = String.Empty;

using (NestedDiagnosticsContext.Push(Guid.NewGuid()))
using (MappedDiagnosticsLogicalContext.SetScoped("xmlFile", xmlFile))
using (MappedDiagnosticsLogicalContext.SetScoped("xml", xml))
{
    try
    {
        Logger.Info("Transformation started.");
        xml = Decorated.TransformTruTopsFABExport(xmlFile);
        MappedDiagnosticsLogicalContext.Set("xml", xml); // Try to remove it
        Logger.Debug("Transformation done.");
        return xml;
    }
    finally
    {
        xml = null;
    }
}

}

我如何更新变量“ xml”并自动在MDC中镜像更新,而无需从新设置? 使用完后,它将自动从堆栈中删除,但看起来像是双重代码。我可以使用类似c指针的东西吗?

编辑:在您问之前,我已经尝试过使用这样的DataClass:

    class Dataclass
{
    public string xml { get; set; }

    public override string ToString()
    {
        return xml;
    }
}

class Logicclass
{
    Logger logger = LogManager.GetLogger("Logicclass");

    public void MyMethod()
    {
        var dc = new Dataclass();

        using (MappedDiagnosticsLogicalContext.SetScoped("xml", dc))
        {
            try
            {
                logger.Info("before XML");
                dc.xml = "xmlcode";
                logger.Info("after XML");
            }
            catch (Exception ex)
            {
                logger.Error(ex, "ow noos!");
                throw;
            }
        }

        logger.Info("after using");
    }
}

是的,它将对其进行更新。但这不是我要找的答案。

编辑: 变量的最简单解决方案是不可变的,引用是行不通的,它使用StringBuilder。更新StringBuilder对象很简单,这是一个通过MDLC使用StringBuilder对象的对象引用的可行解决方案(魔术是在添加内容之前将其清除):

public void MyMethod()
{
    StringBuilder xml = new StringBuilder();
    StringBuilder numbers = new StringBuilder();
    StringBuilder booleans = new StringBuilder();

    using (NestedDiagnosticsContext.Push(Guid.NewGuid()))
    using (MappedDiagnosticsLogicalContext.SetScoped("xml", xml))
    using (MappedDiagnosticsLogicalContext.SetScoped("numbers", numbers))
    using (MappedDiagnosticsLogicalContext.SetScoped("booleans", booleans)) 
    {
        try {

            logger.Info("Before XML change");

            xml.Clear().Append("<?xml version=\"1.0\" encoding=\"utf-8\"?>..");
            numbers.Clear().Append(20);
            logger.Info("After XML change");
            booleans.Clear().Append(true);
            logger.Info("After Boolean change");
            numbers.Clear().Append(100);
            logger.Info("After number change");
            xml.Clear().Append("no xml anymore");
            logger.Info("After XML change");
        }
        catch (Exception ex)
        {
            logger.Error(ex, "ow noos!");
            throw;
        }
    }
    logger.Info("After using");
}

当然,对于返回值,我将是不切实际的,因为您必须将其转换回去,但是在大多数情况下,我是一个很好的解决方案,并且比再次设置MDLC更具可读性。

最好的问候 庞德黑德

1 个答案:

答案 0 :(得分:1)

MappedDiagnosticsLogicalContext.SetScoped不会在处置时恢复任何原始值。它只是删除处置时的活动值。

.NET Framework字符串对象是不可变的,无法修改。您可以考虑使用StringBuilder(其行为类似于您的DataClass)。