问题描述
我尝试构建 WPF 应用程序以通过实体框架之上的 Repositories 与数据库交互,并且我使用 caliburn micro 作为 MVVM 框架
问题是当我尝试通过 Simple Container 在 viewmodels 中注入 Repertories 时,它没有实例化我的 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
已实例化但为空 AppDb
我的问题
如何配置简单容器以将 AppDb
添加到 UserRepo
?
我复制了相同的problem in on GitHub
解决方法
经过一些调试,我发现Configure
方法先运行,然后构造函数调用!!所以实例化是在 Configuration 已经用 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);
}
}