[英]How to properly style a WPF TextBox using Caliburn.Micro MVVM?
[英]How to Inject EF DbContext in Wpf using caliburn micro
我嘗試構建 WPF 應用程序通過 Entity 框架之上的 Repositories 與數據庫交互,我使用caliburn micro作為 MVVM 框架
問題是當我嘗試通過簡單容器在 ViewModels 中注入 Repertories 時,它不會實例化 My DbContext
public class UserRepo : IUserRepo
{
private AppDb _ctx;
public UserRepo(AppDb ctx)
{
_ctx = ctx;
}
}
public class AppDb : DbContext
{
public AppDb(DbContextOptions options) : base(options)
{
}
public DbSet<User> Users { get; set; }
}
class Bootstrapper : BootstrapperBase
{
private SimpleContainer _container = new SimpleContainer();
private AppDb _db;
public Bootstrapper()
{
Initialize();
var options = new DbContextOptionsBuilder<AppDb>()
.UseSqlServer(@"Server=(localdb)\MSSQLLocalDB;Database=XRaySystem;Integrated Security=True;")
.Options;
_db = new AppDb(options);
}
protected override void Configure()
{
_container.Instance(_container);
_container
.Singleton<IWindowManager, WindowManager>()
.Singleton<IEventAggregator, EventAggregator>();
//register the DataContext
// i don't know how to add it
_container.RegisterInstance(typeof(AppDb), null, _db); // <<<<<<<<<< how to add this correctly
//Register Reporisotries
_container
.PerRequest<IUserRepo, UserRepo>();
//Register ViewModels
GetType().Assembly.GetTypes()
.Where(type => type.IsClass)
.Where(type => type.Name.EndsWith("ViewModel"))
.ToList()
.ForEach(viewModelType => _container.RegisterPerRequest(
viewModelType, viewModelType.ToString(), viewModelType));
}
protected override void OnStartup(object sender, StartupEventArgs e)
{
DisplayRootViewFor<DashBoardViewModel>();
//base.OnStartup(sender, e);
}
protected override object GetInstance(Type service, string key)
{
return _container.GetInstance(service, key);
}
protected override IEnumerable<object> GetAllInstances(Type service)
{
return _container.GetAllInstances(service);
}
protected override void BuildUp(object instance)
{
_container.BuildUp(instance);
}
}
class DoctorViewModel : Screen
{
private readonly IUserRepo _userRepo;
public DoctorViewModel(IUserRepo userRepo)
{
_userRepo = userRepo;
}
}
UserRepo
已實例化,但使用 null AppDb
如何配置 Simple Container 以將AppDb
添加到UserRepo
?
經過一番調試,我發現先運行Configure
方法,然后調用構造函數! 所以實例化是在 null 完成配置之后發生的
我通過在Configure
方法本身中添加 _db 的實例化來解決它
class Bootstrapper : BootstrapperBase
{
private SimpleContainer _container = new SimpleContainer();
private AppDb _db;
public Bootstrapper()
{
Initialize();
}
protected override void Configure()
{
var options = new DbContextOptionsBuilder<AppDb>()
.UseSqlServer(@"Server=(localdb)\MSSQLLocalDB;Database=XRaySystem;Integrated Security=True;")
.Options;
_db = new AppDb(options); //<<<< solve the problem
_container.Instance(_container);
_container
.Singleton<IWindowManager, WindowManager>()
.Singleton<IEventAggregator, EventAggregator>();
//register the DataContext
_container.Instance(_db);
// _container.RegisterInstance(typeof(AppDb), null, _db);
//Register Reporisotries
_container
.PerRequest<IUserRepo, UserRepo>();
//Register ViewModels
GetType().Assembly.GetTypes()
.Where(type => type.IsClass)
.Where(type => type.Name.EndsWith("ViewModel"))
.ToList()
.ForEach(viewModelType => _container.RegisterPerRequest(
viewModelType, viewModelType.ToString(), viewModelType));
}
protected override void OnStartup(object sender, StartupEventArgs e)
{
DisplayRootViewFor<DashBoardViewModel>();
//base.OnStartup(sender, e);
}
protected override object GetInstance(Type service, string key)
{
return _container.GetInstance(service, key);
}
protected override IEnumerable<object> GetAllInstances(Type service)
{
return _container.GetAllInstances(service);
}
protected override void BuildUp(object instance)
{
_container.BuildUp(instance);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.