আমি লগিং ফেসকেস যেমন কমন.লগিং (এমনকি আমার নিজের কাটিংএডজ.লগিং লাইব্রেরিটি লুকানোর জন্য ) ব্যবহার করতাম তবে আজকাল আমি ডিপেন্ডেন্সি ইনজেকশন প্যাটার্নটি ব্যবহার করি এবং এটি আমার নিজের (সরল) বিমূর্তনের পিছনে লগারগুলিকে আড়াল করতে দেয় যা উভয় নির্ভরতা মেনে চলে ইনভার্সন প্রিন্সিপাল এবং ইন্টারফেস বিভাজন নীতি(আইএসপি) কারণ এর একটি সদস্য আছে এবং কারণ ইন্টারফেসটি আমার অ্যাপ্লিকেশন দ্বারা সংজ্ঞায়িত করা হয়েছে; বাহ্যিক গ্রন্থাগার নয়। আপনার আবেদনের মূল অংশগুলি বাহ্যিক গ্রন্থাগারগুলির অস্তিত্ব সম্পর্কে যে জ্ঞানটি হ্রাস করছে তা হ্রাস করা; এমনকি আপনার লগিং লাইব্রেরিটি কখনও প্রতিস্থাপনের আপনার কোনও উদ্দেশ্য না থাকলেও। বাহ্যিক লাইব্রেরিতে কঠোর নির্ভরতা আপনার কোড পরীক্ষা করা আরও কঠিন করে তোলে এবং আপনার অ্যাপ্লিকেশনটিকে এমন একটি API দিয়ে জটিল করে তোলে যা আপনার অ্যাপ্লিকেশনটির জন্য বিশেষভাবে কখনই ডিজাইন করা হয়নি।
আমার অ্যাপ্লিকেশনগুলিতে বিমূর্ততাটি প্রায়শই দেখতে লাগে:
public interface ILogger
{
void Log(LogEntry entry);
}
public enum LoggingEventType { Debug, Information, Warning, Error, Fatal };
public class LogEntry
{
public readonly LoggingEventType Severity;
public readonly string Message;
public readonly Exception Exception;
public LogEntry(LoggingEventType severity, string message, Exception exception = null)
{
if (message == null) throw new ArgumentNullException("message");
if (message == string.Empty) throw new ArgumentException("empty", "message");
this.Severity = severity;
this.Message = message;
this.Exception = exception;
}
}
Allyচ্ছিকভাবে, কিছু বিস্তৃত পদ্ধতি (এই ইন্টারফেসটি সংকীর্ণ থাকতে দেয় এবং আইএসপি মেনে চলতে দেয়) দিয়ে এই বিমূর্ততা বাড়ানো যেতে পারে। এটি এই ইন্টারফেসের গ্রাহকদের জন্য কোডটিকে আরও সহজ করে তোলে:
public static class LoggerExtensions
{
public static void Log(this ILogger logger, string message) {
logger.Log(new LogEntry(LoggingEventType.Information, message));
}
public static void Log(this ILogger logger, Exception exception) {
logger.Log(new LogEntry(LoggingEventType.Error, exception.Message, exception));
}
}
যেহেতু ইন্টারফেস কেবলমাত্র একটি পদ্ধতি রয়েছে, আপনি সহজেই একটি তৈরি করতে পারেন ILogger
বাস্তবায়ন যে log4net করতে প্রক্সি , Serilog করতে , Microsoft.Extensions.Logging , NLog বা অন্য কোন লগিং গ্রন্থাগার এবং আপনার দ্বি ধারক কনফিগার শ্রেণীর একটি আছে এটা উদ্বুদ্ধ করতে ILogger
তাদের নির্মাতা
মনে রাখবেন যে একক পদ্ধতির সাথে ইন্টারফেসের উপরে স্থিতিশীল এক্সটেনশন পদ্ধতি থাকা অনেক সদস্যের সাথে ইন্টারফেস থাকা থেকে একেবারে আলাদা। এক্সটেনশন পদ্ধতিগুলি হ'ল সহায়ক পদ্ধতি যা কোনও LogEntry
বার্তা তৈরি করে এবং এটিকে ILogger
ইন্টারফেসের একমাত্র পদ্ধতিতে পাস করে । এক্সটেনশন পদ্ধতিগুলি গ্রাহকের কোডের অংশ হয়ে যায়; বিমূর্তির অংশ নয়। এটি কেবল বিমূর্ততা, এক্সটেনশন পদ্ধতি এবং এগুলি পরিবর্তন না করেই এক্সটেনশন পদ্ধতিগুলি বিকশিত হতে দেয়LogEntry
লগার বিমূর্ততা ব্যবহার করা হয় এমন সময়েও কনস্ট্রাক্টর সর্বদা মৃত্যুদন্ড কার্যকর করা হয়, এমনকি সেই লগারটি স্ট্যাবড / বিদ্রূপ করা হলেও। এটি পরীক্ষার স্যুটটিতে চলাকালীন লগারে কলগুলির যথার্থতা সম্পর্কে আরও নিশ্চিততা দেয়। ওয়ান-মেম্বার ইন্টারফেস পরীক্ষার পাশাপাশি আরও সহজ করে তোলে; অনেক সদস্যের সাথে বিমূর্ততা প্রয়োগ বাস্তবায়ন (যেমন মক, অ্যাডাপ্টার এবং সজ্জকার) তৈরি করা শক্ত করে তোলে।
আপনি যখন এটি করেন, লগিং ফেসিয়াস (বা অন্য কোনও লাইব্রেরি) অফার করতে পারে এমন কোনও স্থির বিমূর্ততার জন্য খুব কমই প্রয়োজন হয়।