如何使用 caliburn micro 在 Wpf 中注入 EF DbContext 查看模型

问题描述

我尝试构建 WPF 应用程序以通过实体框架之上的 Repositories 与数据库交互,并且我使用 caliburn micro 作为 MVVM 框架

问题是当我尝试通过 Simple Containerviewmodels 中注入 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);
    }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...