gpt4 book ai didi

c# - 通过 Bootstrapper OnStartUp 将 Repository 注入(inject) ShellViewModel

转载 作者:行者123 更新时间:2023-11-30 21:27:39 25 4
gpt4 key购买 nike

我卡住了!

我正在使用 Caliburn.micro消除一些实现的痛苦 MVVMWPF应用。

目前我只有一个 View/ViewModel,但将来可能会有多个 ViewModel。当前的 ViewModel 使用存储库来填充对象列表:

public class ShellViewModel : Screen
{

private IMyObjectRepository<IMyObject> _myObjectsRepo = null;
private BindableCollection<MyObject> _myObjects;
private string _connString;


/// <summary>
/// constructor
/// </summary>
public ShellViewModel()
{
//call the method which sets up the repository
GetMyObjectsRepository();

//following three lines cast the list from type IReport to type Report
var IMyObjects= _myObjectsRepo.GetAllIMyObjects();
var myObjects = IMyObjects.OfType<MyObject>().ToList();
MyObjects = new BindableCollection<MyObject>(myObjects );
}

private void GetMyObjectsRepository()
{
_connString = ConfigurationManager.ConnectionStrings["xxx"].ConnectionString;
_myObjectRepo = MyObjectRepositoryFactory.InstantiateRepo(_connString);
}

以上闻起来像是 future 的问题——如果我创建一个不同的 ViewModel,它有自己的属性 BindableCollection<MyObject> _myObjects;那么相同对象的两个集合可能很快就会有不同的状态,即第一个 ViewModel 中的 ObjectX 可能会更改其名称属性,但 ObjectX 在第二个 ViewModel 中仍具有其原始名称。

我在想我可以注入(inject)这个 <MyObject> 的列表在构建时进入 ViewModel - 我应该在 Bootstrapper.cs 中执行此操作吗? ? (我宁愿避免完全成熟的 DI,因为这是一个小项目)

当前 Bootstrapper.cs看起来像下面这样——我如何将上面代码片段中的一些逻辑移到这里?它是否在 OnStartUp 中?事件方法?如果是,那又如何?

using Caliburn.Micro;
using Prototype_WPF.ViewModels;
using System.Windows;

namespace Prototype_WPF
{
public class Bootstrapper: BootstrapperBase
{

public Bootstrapper()
{
Initialize();
}

protected override void OnStartup(object sender, StartupEventArgs e)
{
DisplayRootViewFor<ShellViewModel>();
}

}
}

最佳答案

您可以使用 Handler 方法在 Bootstrap 中为您的 View 模型注册工厂方法:

public class Bootstrapper : BootstrapperBase
{
private readonly BindableCollection<MyObject> _myObjects = new BindableCollection<MyObject>();
private SimpleContainer container;

public Bootstrapper()
{
Initialize();
}

protected override void Configure()
{
container = new SimpleContainer();
container.Singleton<IWindowManager, WindowManager>();
container.Handler<ShellViewModel>(_ => new ShellViewModel(_myObjects));
container.Handler<SomeOtherViewModel>(_ => new SomeOtherViewModel(_myObjects));
}

protected override void OnStartup(object sender, StartupEventArgs e)
{
DisplayRootViewFor(typeof(ShellViewModel));
}

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);
}
}

关于c# - 通过 Bootstrapper OnStartUp 将 Repository 注入(inject) ShellViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57465893/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com