Prism 7.2 Как внедрить экземпляр во ViewModel другого модуля - PullRequest
1 голос
/ 14 апреля 2020

Я новичок в разработке приложений WPF с PRISM и AKKA. NET framework.

В своем коде для Shell Window я создал экземпляр ActorSystem.

 public partial class App
{
    private ActorSystem appActorSystem;
    protected override Window CreateShell()
    {
        return Container.Resolve<MainWindow>();
    }

    protected override void RegisterTypes(IContainerRegistry containerRegistry)
    {
        appActorSystem = ActorSystem.Create(System.Reflection.Assembly.GetEntryAssembly()?.GetName().Name);
        containerRegistry.RegisterInstance(appActorSystem);
    }


    protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
    {
        moduleCatalog.AddModule<CommandBar.CommandBarModule>();
    }

    protected override void OnExit(ExitEventArgs e)
    {
        appActorSystem.Terminate();
        appActorSystem.Dispose();
        base.OnExit(e);
    }
}

Экземпляр будет зарегистрирован в DI Container (Unity) после создания.

В моем приложении у меня также есть модуль.

 public class CommandBarModule : IModule
{
    private IContainerProvider _containerProvider;
    public void OnInitialized(IContainerProvider containerProvider)
    {
        _containerProvider = containerProvider;
        var appActorSystem = _containerProvider.Resolve<ActorSystem>();

        var regionManager = _containerProvider.Resolve<IRegionManager>();
        regionManager.RegisterViewWithRegion(regionNames.CommandBar, typeof(ViewA));
    }


    public void RegisterTypes(IContainerRegistry containerRegistry)
    {
        containerRegistry.RegisterForNavigation<ViewA>();
    }
}

Я хочу получить экземпляр Actorsystem в модуль. Он отлично работает в классе CommandBarModule.

Но я также хочу получить экземпляр моей системы Actorsystem в ViewModel модуля ...

 public class ViewAViewModel : BindableBase
{

    private string _message;
    public string Message
    {
        get { return _message; }
        set { SetProperty(ref _message, value); }
    }


    public ViewAViewModel()
    {

        Message = "test";
    }
}

Моя первая идея заключалась в том, что я могу сделать инъекцию IContainerProvider в конструктор ViewModel, например:

public class ViewAViewModel : BindableBase
{
    private IContainerProvider _containerProvider;

    private string _message;
    public string Message
    {
        get { return _message; }
        set { SetProperty(ref _message, value); }
    }


    public ViewAViewModel(IContainerProvider containerProvider)
    {
        _containerProvider = containerProvider;
        var appActorSystem = _containerProvider.Resolve<ActorSystem>();

        Message = "test";
    }
}

Но это не работает ...

Не могли бы вы объяснить, как это сделать правильно?

1 Ответ

1 голос
/ 14 апреля 2020

Внедрить зависимость, а не контейнер:

public ViewAViewModel(ActorSystem appActorSystem)
{
    Message = "test";
}

Не имеет значения, в каком модуле зарегистрирована служба и где она разрешена, если она разрешена после зарегистрирован.

...