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
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | 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
01 02 03 04 05 06 07 08 09 10 11 12 13 14 | // 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.