Начал изучать принципы DI и работу с IoC контейнерами. Вопрос следующего характера: Пусть у меня есть некая библиотека классов MyClassLibrary, там представлены следующие классы:
public class DefaultDownloader : IDownloader
{
public string DownloadSomething(string param)
{
return $"{nameof(DefaultDownloader)} {param}";
}
}
public static class MyContainer
{
public static IContainer Container { get; set; }
static MyContainer()
{
var builder = new ContainerBuilder();
builder.RegisterType<DefaultDownloader>().As<IDownloader>();
builder.RegisterType<FirstSource>().AsSelf();
builder.RegisterType<SecondSource>().AsSelf();
Container = builder.Build();
}
}
public class SourceControl
{
public string GetAllInfo(string param)
{
string toReturn = "";
using (var scope = MyContainer.Container.BeginLifetimeScope())
{
var source1 = scope.Resolve<FirstSource>();
var source2 = scope.Resolve<SecondSource>();
toReturn += source1.DownloadInformation("FirstSource");
toReturn += " "+ source2.DownloadInformation("SecondSource");
}
return toReturn;
}
}
public class FirstSource
{
private readonly IDownloader downloader;
public FirstSource(IDownloader downloader)
{
this.downloader = downloader;
}
public string DownloadInformation(string param)
{
return downloader.DownloadSomething(param);
}
}
public class SecondSource
{
private readonly IDownloader downloader;
public SecondSource(IDownloader downloader)
{
this.downloader = downloader;
}
public string DownloadInformation(string param)
{
return downloader.DownloadSomething(param);
}
}
public interface IDownloader
{
string DownloadSomething(string param);
}
Этими классами можно пользоваться и по отдельности, но есть еще один класс (SourceControl), который позволяет забирать информацию со всех источников. В классе необходимо создать экземпляры источников (FirstSource, SecondSource) и вызвать некоторые методы оттуда. Соответственно, в этом же классе придется внедрять зависимости в FirstSource и SecondSource.
Использование извне:
class Program
{
private static IContainer Container { get; set; }
public static void ConfigureContainer()
{
var builder = new ContainerBuilder();
builder.RegisterType<MySecondDownloader>().As<IDownloader>();
builder.RegisterType<FirstSource>().AsSelf();
builder.RegisterType<SecondSource>().AsSelf();
Container = builder.Build();
}
static void Main(string[] args)
{
// Следующие две строчки можно закомментировать, чтобы использовать
// "стандартный" контейнер
ConfigureContainer();
MyContainer.Container = Container;
SourceControl sourceControl = new SourceControl();
Console.WriteLine(sourceControl.GetAllInfo("Main"));
Console.ReadLine();
}
}
public class MyFirstDownloader : IDownloader
{
public string DownloadSomething(string param)
{
return $"{nameof(MyFirstDownloader)} {param} - MODIFIED! (1)";
}
}
public class MySecondDownloader : IDownloader
{
public string DownloadSomething(string param)
{
return $"{nameof(MySecondDownloader)} {param} - MODIFIED! (2)";
}
}
Вопрос: Как это более правильно сделать с точки зрения логики и DI. В качестве IoC контейнера планирую использовать autofac. И правильно ли я сейчас это делаю?
IGetMaxInfo<T>? – PracticeMakesPerfect Sep 01 '19 at 15:31но есть еще один класс, который позволяет забирать информацию со всех источников, запускаете его, и если с ним возникают проблемы - обновляете вопрос и тогда будем смотреть. Пока что я проблемы в вашем вопросе не вижу. – tym32167 Sep 01 '19 at 15:46