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