Первоначальной ошибкой было то, что контейнер выбирал конструктор, который ожидал DbContextOptionsBuilder
, который conateinr не знал, как правильно разрешить.
Поскольку контекст настраивается в переопределении OnConfiguring
, нет необходимости в
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{ }
Удалить этот конструктор, чтобы контейнер разрешал контекст без ошибок.
В зависимости от потока инициализации зависимости и доступа к ней, этот контекст должен быть явно вставлен в модель представления, а не напрямую в представление.
Следуя MVVM, имейте все необходимые зависимости и привязываемые свойства вмодель представления
public class MainWindowViewModel : BaseViewModel {
private readonly ApplicationDbContext db;
public MainWindowViewModel(ApplicationDbContext db) {
this.db = db;
}
private ICommand goPack;
public ICommand GoPack {
get {
return goPack
?? (goPack = new ActionCommand(() =>
{
var c = db.Parts;
FrameContent.Navigate(new PageConsignments());
}));
}
}
}
Обновите представление, чтобы оно зависело от модели представления
public class MainWindow : Window {
[Dependency]
public MainWindowViewModel ViewModel {
set { DataContext = value; }
}
public MainWindow() {
InitializeComponent();
Loaded += OnLoaded;
}
void OnLoaded(object sender, EventArgs args) {
FrameContent.Navigate(new PageConsignments());
}
}
Теперь осталось только убедиться, что все зависимости зарегистрированы в контейнере
public class App : Application {
protected override void OnStartup(StartupEventArgs e) {
IUnityContainer container = new UnityContainer();
container.RegisterType<ApplicationDbContext>();
container.RegisterType<MainWindowViewModel>();
container.RegisterType<MainWindow>();
MainWindow mainWindow = container.Resolve<MainWindow>();
mainWindow.Show();
}
}
Там, где это возможно, Принцип явных зависимостей через внедрение конструктора должен быть более предпочтительным, чем внедрение свойства.
Но поскольку большинство представлений плохо поддаются внедрению конструктора, обычно применяется последнее.Убедившись, что модель представления имеет все необходимые зависимости, прежде чем вводить ее в представление, вы обеспечите доступность всех необходимых значений при необходимости.