Skip to content

Instantly share code, notes, and snippets.

@justinyoo
Last active July 2, 2020 02:28
Show Gist options
  • Save justinyoo/e5b18f907f6a1b22614c4e487cfe185f to your computer and use it in GitHub Desktop.
Save justinyoo/e5b18f907f6a1b22614c4e487cfe185f to your computer and use it in GitHub Desktop.
5 Ways Injecting Multiple Instances of Same Interface on ASP.NET Core
public interface IFeedReader
{
string Name { get; }
string GetSingleFeedTitle();
}
public class BlogFeedReader : IFeedReader
{
public BlogFeedReader()
{
this.Name = "Blog";
}
public string Name { get; }
public string GetSingleFeedTitle()
{
return "This is blog item 1";
}
}
public class PodcastFeedReader : IFeedReader
{
public PodcastFeedReader()
{
this.Name = "Podcast";
}
public string Name { get; }
public string GetSingleFeedTitle()
{
return "This is audio item 1";
}
}
public class YouTubeFeedReader : IFeedReader
{
public YouTubeFeedReader()
{
this.Name = "YouTube";
}
public string Name { get; }
public string GetSingleFeedTitle()
{
return "This is video item 1";
}
}
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IFeedReader, BlogFeedReader>();
services.AddTransient<IFeedReader, PodcastFeedReader>();
services.AddTransient<IFeedReader, YouTubeFeedReader>();
}
public class BlogFeedService
{
private readonly IFeedReader _reader;
public BlogFeedService(IEnumerable<IFeedReader> readers)
{
this._reader = readers.SingleOrDefault(p => p.Name == "Blog");
}
public string GetTitle()
{
return this._reader.GetSingleFeedTitle();
}
}
public class BlogFeedService
{
private readonly IEnumerable<IFeedReader> _readers;
public BlogFeedService(IEnumerable<IFeedReader> readers)
{
this._readers = readers;
}
public string GetTitle()
{
foreach (reader in this._readers)
{
if (reader.Name != "Blog")
{
continue;
}
return reader.GetSingleFeedTitle();
}
}
}
public interface IFeedReaderResolver
{
IFeedReader Resolve(string name);
}
public class FeedReaderResolver : IFeedReaderResolver
{
private readonly IServiceProvider _provider;
public FeedReaderResolver(IServiceProvider provider)
{
this._provider = provider;
}
public IFeedReader Resolve(string name)
{
var type = Assembly.GetAssembly(typeof(FeedReaderResolver)).GetType($"{name}FeedReader");
var instance = this._provider.GetService(type);
return instance as IFeedReader;
}
}
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<BlogFeedReader>();
services.AddTransient<PodcastFeedReader>();
services.AddTransient<YouTubeFeedReader>();
services.AddTransient<IFeedReaderResolver, FeedReaderResolver>();
}
public class BlogFeedService
{
private readonly IFeedReader _reader;
public BlogFeedService(IFeedReaderResolver resolver)
{
this._reader = resolver.Resolve("Blog");
}
public string GetTitle()
{
return this._reader.GetSingleFeedTitle();
}
}
public class FeedReaderResolver : IFeedReaderResolver
{
public IFeedReader Resolve(string name)
{
var type = Assembly.GetAssembly(typeof(FeedReaderResolver)).GetType($"{name}FeedReader");
var instance = Activator.CreateInstance(type);
return instance as IFeedReader;
}
}
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IFeedReaderResolver, FeedReaderResolver>();
}
public delegate IFeedReader FeedReaderDelegate(string name);
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<BlogFeedReader>();
services.AddTransient<PodcastFeedReader>();
services.AddTransient<YouTubeFeedReader>();
services.AddTransient<FeedReaderDelegate>(provider => name =>
{
var type = Assembly.GetAssembly(typeof(FeedReaderResolver)).GetType($"FeedReaders.{name}FeedReader");
var instance = provider.GetService(type);
return instance as IFeedReader;
});
}
public class BlogFeedService
{
private readonly FeedReaderDelegate _delegate;
public BlogFeedService(FeedReaderDelegate @delegate)
{
this._delegate = @delegate;
}
public string GetTitle()
{
return this._delegate("Blog").GetSingleFeedTitle();
}
}
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<BlogFeedReader>();
services.AddTransient<PodcastFeedReader>();
services.AddTransient<YouTubeFeedReader>();
services.AddTransient<Func<string, IFeedReader>>(provider => name =>
{
var type = Assembly.GetAssembly(typeof(FeedReaderResolver)).GetType($"FeedReaders.{name}FeedReader");
var instance = provider.GetService(type);
return instance as IFeedReader;
});
}
public class BlogFeedService
{
private readonly Func<string, IFeedReader> _func;
public BlogFeedService(Func<string, IFeedReader> func)
{
this._func = func;
}
public string GetTitle()
{
return this._func("Blog").GetSingleFeedTitle();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment