Amaliyotim uchun oqilona disk raskadrovka rejimi qanday amalga oshiriladi?

.NET winforms dasturi bor va men disk raskadrovka rejimining noqulay oldini olish uchun harakat qilaman Foydalanuvchi foydalanuvchi sifatida Debugni yoqish ni tanlaydi va shu bilan ba'zi operatsiyalar jurnalni yozish, xabarlarni ko'rsatish va hk kabi amalga oshiriladi ..
Men takrorlashdan qochmoqchiman

If me.DebugMode then  
    Write a log
    Display A Message on the textBox  
    .....

Men foydalanadigan usullarning bir nechta/ko'pi mavjud va men yuqoridagi kod bilan kodni ifloslantirish fikrini yoqtirmayman Qabul qiladigan har qanday tavsiyalar P.S, chunki bu erda "noto'g'ri" teg haqida ba'zi "shikoyatlar" mavjud C# -dagi bir xil psödo kod

if(DebugMode.Checked ==true)
{
Write A log
Display A messagge on the textbox
Dump data as CSV
Activate Tab for Comparing data Before/After
}
1
Bu erda dekorativ sinflarga qaramlik in'ektsiyasi kabi foydali bo'lishi mumkin.
qo'shib qo'ydi muallif Enigmativity, manba
C # tizimi tomonidan taklif qilingan va kod haqiqiy kod emas, pseudocode Bu yerda ba'zi katta javoblar bor, shuning uchun ularni tekshirish uchun vaqt kerak ...
qo'shib qo'ydi muallif John, manba
Bundan tashqari, men C#, VB.NET yoki boshqa dasturlash tiliga umuman e'tiroz qilmayman
qo'shib qo'ydi muallif John, manba
Taginiz - C#, lekin kodingiz VB, shunday emasmi? Bundan tashqari, sizning savolingiz noaniq, shuning uchun siz aniq javob oldingiz. Barcha tegishli kod faqat logga yozish va xabarni ko'rsatadimi? Variantlar mavjud bo'lsa, u haqda biror narsa kiritishingiz kerak.
qo'shib qo'ydi muallif user34660, manba

6 javoblar

Mana bir yondashuv.

Bu kodni menda aytaylik:

void Main()
{
    var dc = new DistanceConversion();
    var miles = 4.5;
    Console.WriteLine("{0} miles is {1} kilometres", miles, dc.MilesToKilometres(miles));
}

public class DistanceConversion
{
    public double MilesToKilometres(double miles)
    {
        return miles * 8.0/5.0;
    }
}

Men bu ishni boshlaganimda quyidagilarga erishaman:

4.5 miles is 7.2 kilometres

Menga interfeysning namunasini yaratishga ruxsat berish uchun qaramlik inyeksion kutubxonasidan foydalanishim mumkin.

void Main()
{
   //Somewhere in my configuration
    var injectivity = Injectivity.Context.CreateRoot();
    injectivity.SetFactory();

   //Here's the previous example using dependency injection.
    var dc = injectivity.Resolve();
    var miles = 4.5;
    Console.WriteLine("{0} miles is {1} kilometres", miles, dc.MilesToKilometres(miles));
}

public interface IDistanceConversion
{
    double MilesToKilometres(double miles);
}

public class DistanceConversion : IDistanceConversion
{
    public double MilesToKilometres(double miles)
    {
        return miles * 8.0/5.0;
    }
}

Men bu ishni boshlaganimda quyidagilarga erishaman:

4.5 miles is 7.2 kilometres

Endi jurnalni bezashni tanitishim mumkin:

public class DistanceConversionLoggingDecorator
    : Injectivity.DecoratorBase, IDistanceConversion
{
    public double MilesToKilometres(double miles)
    {
        Console.WriteLine("CONVERTING " + miles);
        return this.Inner.MilesToKilometres(miles);
    }
}

Va konfiguratsiya bo'limiga bir satr qo'ying:

injectivity.SetDecorator();

Men bu ishni boshlaganimda quyidagilarga erishaman:

CONVERTING 4.5
4.5 miles is 7.2 kilometres

Shunday qilib, kodimni o'zgartirmasdan, konfiguratsiya vaqtida mening kodimga kirishni kiritishi mumkin.

Men ham oldinga borib, sinflarga atributlarni qo'llashim mumkin:

[Injectivity.Attributes.Decorator(typeof(IDistanceConversion))]
public class DistanceConversionLoggingDecorator
    : Injectivity.DecoratorBase, IDistanceConversion
{ ... }

[Injectivity.Attributes.Factory(typeof(IDistanceConversion))]
public class DistanceConversion : IDistanceConversion
{ ... }

Endi SetFactory va SetDecorator usullarini ishlatish o'rniga, buning o'rniga foydalanishingiz mumkin:

injectivity.Register(this.GetType().Assembly);

Nihoyat, xohlasam, atributlardan qochib, konfiguratsiya uchun xml faylini belgilashim mumkin, shunda men buni bajaraman:

var injectivity = Injectivity.Context.LoadRoot("config.xml");

Endi konfiguratsiya faylini o'zgartirib, kodni o'zgartirishdan va agar iboralari va kirish buyruqlar bo'lsa, uni ko'paytirmasdan jurnalni o'chirishingiz yoki o'chirishingiz mumkin.

1
qo'shib qo'ydi
@AlexanderPowolozki - Men bir necha yil avval yozgan ramkadan foydalanardim. Bu juda mustahkam va mustahkam. Lekin bu tushunchani tasvirlab berardim.
qo'shib qo'ydi muallif Enigmativity, manba
Sizda aniq konstruktsiyani tushunishingiz kerakmi yoki siz DI va konstruktiv naqsh tushunchasini taqdim qilmoqchisiz?
qo'shib qo'ydi muallif Alexander Powolozki, manba

Bayroqni haqiqiy deb hisoblasangiz, bayroqni va delegatni bajaradigan yordamchi sinfni yozishingiz mumkin. Ushbu misolda, delegat shuningdek, konsol chiqishi uchun yoziladigan (u osonlik bilan log faylga yozish uchun) qo'shiladigan mag'lubiyatni qaytaradi.

static class DebugLog
{
    static public void Write(bool flag, Func f)
    {
        if (flag) Console.WriteLine(f);
    }
}

Siz buni shunday deb atashingiz mumkin:

DebugLog.Write(this.DebugMode,() => "This is a string I wish to log");

Agar siz qo'shimcha ishlov berishni qo'shmoqchi bo'lsangiz, delegatsiya organini {} da qo'shib, qo'shimcha bayonotlar qo'sha olasiz:

DebugLog.Write(this.DebugMode,() => {
                                         this.DisplayMessage("You're debugging!");
                                         return "This is a string I wish to log");
                                     });

P.S. Siz namunangizda me kodini ishlatgansiz, lekin bu yozuvni C# deb belgiladingiz, shuning uchun mening misolim c #da joylashgan.

Agar disk raskadrovka bayrog'i global holatning bir qismi bo'lsa, siz individual qo'ng'iroqlarni soddalashtira olasiz.

static class DebugLog
{
    static public bool DebugMode = true;

    static public void Write(Func f)
    {
        if (DebugMode) Console.WriteLine(f);
    }
}

bu shunday qilishni osonlashtiradi:

DebugLog.Write(() => "This is a string I wish to log");
0
qo'shib qo'ydi

WPF uchun shunday bir narsa yozganman va codeproject da e'lon qilingan ancha vaqt oldin.

Bu asosan uch qismdan iborat:

  1. A class that inherits from TraceListener that routes trace messages to a UI component
  2. A UI component that listens for trace output and displays
  3. A binder (ITraceTextSink) that the TraceListener uses to send output to the UI

Xuddi shu kontseptsiya UI va bog'lash kodini almashtirish orqali WinForms-ga osonlikcha amal qilishi mumkin.

Bu sizga rel="nofollow noreferrer"> yozib olishingiz mumkin. Trace.WriteLine sizga o'xshab qaerda bo'lsangiz, qayerda bo'lsangiz ham "disk raskadrovka" rejimi yoqilgan bo'lsa. "Debug" rejimi TraceListener ni qo'shish va foydalanuvchi interfeysini ko'rsatishdan iborat.

Agar siz bog'langan kodli loyiha kodidagi kodni aylantirmoqchi bo'lsangiz, unda mantiqan to'g'ri bo'lishi kerak.

WinForms-da o'zgarishsiz ishlaydigan qism bu kabi ko'rinadigan TraceListener (bu ITraceTextSink ilovasini Winforms UI komponentiga proksi qilish uchun kerak bo'ladi), bu FlowDocument bu wpf versiyasida, lekin matn RichTextBox tekshiruviga osonlik bilan yetib kelishi bilanoq pompalanadi).

sealed class TraceTextSource : TraceListener
{
    public ITraceTextSink Sink { get; private set; }
    private bool _fail;
    private TraceEventType _eventType = TraceEventType.Information;

    public TraceTextSource(ITraceTextSink sink)
    {
        Debug.Assert(sink != null);
        Sink = sink;
    }

    public override void Fail(string message)
    {
        _fail = true;
        base.Fail(message);
    }

    public override void TraceEvent(TraceEventCache eventCache, string source, TraceEventType eventType, int id, string message)
    {
        _eventType = eventType;
        base.TraceEvent(eventCache, source, eventType, id, message);
    }

    public override void Write(string message)
    {
        if (IndentLevel > 0)
            message = message.PadLeft(IndentLevel + message.Length, '\t');

        if (_fail)
            Sink.Fail(message);

        else
            Sink.Event(message, _eventType);

        _fail = false;
        _eventType = TraceEventType.Information;
    }

    public override void WriteLine(string message)
    {
        Write(message + "\n");
    }
}

"Debug" rejimida ITraceTextSource ilovasini tatbiq qilgandan so'ng, uni izlar tinglovchilarining kollektsiyasiga qo'shishni talab qiladi.

Trace.Listeners.Add(new TraceTextSource(new YourTraceSink()));
0
qo'shib qo'ydi

Postsharp haqida ma'lumot oling https://www.ospsharp.net/diagnostics/net-logging Bu men tasavvur qilishim mumkin bo'lgan uslub

0
qo'shib qo'ydi

Log4net kabi logging tizimini disk raskadrovka, ma'lumot, ogohlantirish, xato yoki o'lik kabi turli xil jurnallar darajalariga to'g'ri yo'naltirilgan chaqiriq bilan ishlatishingiz mumkin. Foydalanuvchining profili Keyinchalik odatiy yoki to'liq donerni cheklash bilan minimal daraja va maqsadga (konsol, fayl, voqea jurnali, ma'lumotlar bazasi va h.k.) faollashtirish va o'chirishni boshqarasiz.
Umuman olganda, to'g'ri jurnalga yozish manba kodining majburiy qismi bo'lishi kerak.

0
qo'shib qo'ydi

Forma sinfidan olingan va sinfda kerakli xatti-harakatni amalga oshiradigan sinf yaratish. Keyin barcha sinflaringizni ushbu yangi sinfdan oling.

0
qo'shib qo'ydi