У меня есть следующий фрагмент кода на моем ViewModel
, и я хотел бы избавиться от ключевого слова new
и возложить ответственность за создание на DI-контейнер. Однако у меня возникают некоторые трудности с возможностью ввода IDataFileReader
в мой ViewModel
, поскольку данный параметр progress
связан со свойством ViewModel
ProgressBarValue
.
По сути, мой файл-ридер требует прогресс в качестве параметра, чтобы я мог отображать прогресс в своем пользовательском интерфейсе.
Так что вопрос в том, как зарегистрировать IDataFileReader
с модулями AutoFac на
ViewModelLocator
VieModel.cs
ProgressBarIsIndetermined = true;
var progress = new Progress<int>(status => { ProgressBarValue = status; });
await Task.Run(() =>
{
IDataFileReader fileImporter = new DataFileReader(progress);
DataSet = new ObservableCollection<MeasurementPoint>(fileImporter.DataSet);
});
Я использую Mvvm Light viewmodelLocator
и MVVM с WPF. Для простых сервисов, которые не требуют каких-либо параметров, я могу легко добиться этого путем внедрения в конструктор.
ViewModelLocator.cs
static ViewModelLocator()
{
var builder = new ContainerBuilder();
builder.RegisterModule<AutofacModule>();
var container = builder.Build();
ServiceLocator.SetLocatorProvider(() => new AutofacServiceLocator(container));
}
public SettingsViewModel SettingsViewModel => ServiceLocator.Current.GetInstance<SettingsViewModel>();
AutoFacModule.cs
Следующий модуль является всего лишь черновиком и будет работать для простого конструктора без параметров.
public class AutofacModule : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterType<DataFileReader>().As<IDataFileReader>();
builder.RegisterType<SettingsViewModel>().AsSelf().SingleInstance();
}
}