簡體   English   中英

如何使用 caliburn micro 在 Wpf 中注入 EF DbContext

[英]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);
    }
}

查看 model

class DoctorViewModel : Screen
{
    private readonly IUserRepo _userRepo;

    public DoctorViewModel(IUserRepo userRepo)
    {
        _userRepo = userRepo;
    }
}

UserRepo已實例化,但使用 null AppDb

我的問題

如何配置 Simple Container 以將AppDb添加到UserRepo

在 GitHub 上重現了同樣的問題

經過一番調試,我發現先運行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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM