Расширение Factory Ninject вместо IResolutionRoot + Caliburn - PullRequest
0 голосов
/ 08 сентября 2018

Я изучаю Ninject и Caliburn, и я тестирую и читаю .....

В моем примере я нашел способ реализовать IResolutionRoot,

но я читал там также возможность использовать Factory?

Я читал вики о Ninject.Extensions.Factory (прокси), но я не понимаю, как реализовать в моем примере, не могли бы вы помочь мне показать правильный способ реализовать это. ?? я выставляю свой исходный код, который может помочь начинающим ..

второй вопрос, является ли правильный код для привязки вида и модели представления с помощью caliburn. (Со статическими функциями) ..?

Вот мой Bootstrapper

using Caliburn.Micro;
using Ninject;
using System;
using System.Collections.Generic;
using System.Windows;
using TestNinjectCaliburn.ViewModels;
using EventAggregator = TestNinjectCaliburn.Events.EventAggregator;
using IEventAggregator = TestNinjectCaliburn.Events.IEventAggregator;

namespace TestNinjectCaliburn
{
    public class Bootstrapper : BootstrapperBase
    {
        private IKernel kernel;
        public Bootstrapper()
        {
            Initialize();
        }

        protected override void Configure()
        {
            kernel = new StandardKernel();

            kernel.Bind<IEventAggregator>().To<EventAggregator>().InSingletonScope();
            kernel.Bind<IWindowManager>().To<WindowManager>().InSingletonScope();
            kernel.Bind<MainWindowViewModel>().ToSelf().InSingletonScope();
        }

        protected override void OnStartup(object sender, StartupEventArgs e)
        {
            DisplayRootViewFor<MainWindowViewModel>();
        }
        protected override object GetInstance(Type service, string key)
        {
            return kernel.Get(service);
        }

        protected override IEnumerable<object> GetAllInstances(Type service)
        {
            return kernel.GetAll(service);
        }
    }
}

Мой SecondView, который создает экземпляры классов:

using Caliburn.Micro;
using Ninject;
using Ninject.Parameters;
using Ninject.Syntax;
using System;
using System.Linq;
using System.Reflection;
using System.Windows;
using System.Windows.Controls;

namespace TestNinjectCaliburn.Views
{
    public partial class SecondView : Window
    {

        private readonly IResolutionRoot resolutionroot;
        public SecondView( IResolutionRoot resolutionroot)
        {
            this.resolutionroot = resolutionroot;

            InitializeComponent();

            Type[] typelist = GetTypesInNamespace(Assembly.GetExecutingAssembly(), "TestNinjectCaliburn.Gauges");

            var left = 0d;
            var top = 100d;
            var id = 0;
            foreach(Type t in typelist)
            {
                string dis = $"{((char)(id + 'A')).ToString()}";

                //Parameter for constructors VievModel A, B and C
                Ninject.Parameters.Parameter[] param = new Ninject.Parameters.Parameter[] { new ConstructorArgument("id", dis, true) };


                // Replace the Activator.CreateInstance
                var viewmodel = resolutionroot.TryGet(t, param);

                //binding view and viewmodel for Caliburn
                var view = ViewLocator.LocateForModel(viewmodel, null, null);
                ViewModelBinder.Bind(viewmodel, view, null);

                MainGrid.Children.Add(view);

                var uc = view as UserControl;
                uc.Margin = new Thickness(left, top, 0, 0);

                id = id + 1;
                left = left + 150;
            }
        }

        private Type[] GetTypesInNamespace(Assembly assembly, string nameSpace)
        {
            return
              assembly.GetTypes()
                      .Where(t => String.Equals(t.Namespace, nameSpace, StringComparison.Ordinal) && t.FullName.EndsWith("ViewModel"))
                      .ToArray();
        }
    }
}

The SecondView Xaml:

<Window x:Class="TestNinjectCaliburn.Views.SecondView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:TestNinjectCaliburn.Views"
        mc:Ignorable="d"
        Title="SecondView" Height="400" Width="800">
    <Grid x:Name="MainGrid">

    </Grid>
</Window>

Пример вызова viewModel и связанного с ним представления:

using Caliburn.Micro;
using IEventAggregator = TestNinjectCaliburn.Events.IEventAggregator;

namespace TestNinjectCaliburn.Gauges
{
    public class A_ViewModel:PropertyChangedBase
    {
        private readonly IEventAggregator eventAggregator;

        public A_ViewModel(IEventAggregator eventAggregator, string id)
        {
            this.eventAggregator = eventAggregator;
            Display = id;
        }
        private string display;

        public string Display
        {
            get { return display; }
            set
            {
                display = value;
                NotifyOfPropertyChange(() => Display);
            }
        }

        public void Test()
        {
            Display = "I am A";
        }
    }
}

его вид:

<UserControl x:Class="TestNinjectCaliburn.Gauges.A_View"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:TestNinjectCaliburn.Gauges"
             mc:Ignorable="d" 
             d:DesignHeight="110" d:DesignWidth="100">
    <Grid>
        <Button x:Name="Test" Content="Test Caliburn"  Margin="0,0,0,0" Width="100" Height="30" HorizontalAlignment="Left" VerticalAlignment="Top"/>
        <TextBlock x:Name="Display" Margin="0,40,0,0" TextWrapping="Wrap" HorizontalAlignment="Left" VerticalAlignment="Top" Width="100" Height="30"/>
    </Grid>
</UserControl>

Спасибо за вашу помощь

...