Pattern: CompositeProvider
Description
Composite Provider pattern is a structural design pattern that lets you compose objects into tree structures to represent part-whole hierarchies.
Composite lets clients treat individual objects and compositions of objects uniformly.
Example in .NET :
CompositeProvider
using Microsoft.Extensions.FileProviders; namespace CompositeProvider; public class CompositeProviderDemo { private readonly IFileProvider _fileProvider; public CompositeProviderDemo(string folder) { var fileOnHDDProvider = new PhysicalFileProvider(folder); var manifestEmbeddedProvider = new ManifestEmbeddedFileProvider(this.GetType().Assembly); _fileProvider = new CompositeFileProvider(fileOnHDDProvider,manifestEmbeddedProvider); } public string[] GetFiles() { List<string> ret = []; var files = _fileProvider.GetDirectoryContents(string.Empty); var contents = _fileProvider.GetDirectoryContents(string.Empty); foreach (var fileInfo in contents) { ret.Add(fileInfo.Name); } return ret.ToArray(); } public string GetContentFile(string name) { var fileInfo = _fileProvider.GetFileInfo(name); if (fileInfo.Exists) { using var stream = fileInfo.CreateReadStream(); using var reader = new StreamReader(stream); return reader.ReadToEnd(); } return string.Empty; } }
And his usage
// See https://aka.ms/new-console-template for more information using CompositeProvider; Console.WriteLine("Hello, World!"); var path = Directory.GetParent(Environment.CurrentDirectory); ArgumentNullException.ThrowIfNull(path); CompositeProviderDemo compositeProvider = new(path.FullName) ; Console.WriteLine("Files in the current directory:"); foreach (var file in compositeProvider.GetFiles()) { Console.WriteLine(file); } Console.WriteLine("obtain MyResource.txt even if does not exists on folder"); Console.WriteLine(compositeProvider.GetContentFile("MyResource.txt"));
Learn More
Source Code for Microsoft implementation of CompositeProvider SourceCode Composite Provider
Learn More File Providers in ASP.NET Core
Wikipedia
}
Homework
Imagine that you have 2 loggers , for a file and a console.
Implement a composite provider that allows you to log to multiple destinations at the same time.
Leave a Reply