Реализация, очевидно, зависит от того, какой контейнер вы используете, но если бы мне нужно было сделать что-то подобное в Autofac, я, вероятно, сделал бы это:
public SearchViewModel(Func<Owned<IDownloader>> downloaderFactory)
: base(model)
{
_downloaderFactory = downloaderFactory;
}
private void Download(object sender, DoWorkEventArgs e)
{
_downloaderFactory().Value.Download(item);
}
Owned<T>
- это класс Autofac, представляющий экземпляр T, который не принадлежит контейнеру - класс, который разрешает его, отвечает за его удаление. Я не уверен на 100%, будет ли Autofac возвращать мне новый экземпляр IDownloader
при каждом вызове Func<IDownloader>
, поэтому я бы использовал Owned<T>
, чтобы быть уверенным.
Некоторые контейнеры IoC не имеют концепции отслеживания владения / срока службы, поэтому достаточно взять зависимость от Func<IDownloader>
- вам гарантированно будет каждый раз получать новый экземпляр.