System.NullReferenceException в DisplayRootViewFor в Caliburn Micro - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь интегрировать агрегатор событий в свое приложение, и, следуя онлайн-документации, я не совсем смог заставить его работать, а также не могу найти полный пример для просмотра. Приложение, которое я пытаюсь создать, представляет собой простую поисковую систему для нашей внутренней базы знаний, поэтому все, что у него есть, - это 3 просмотра - главная страница поиска (страница root), страница результатов и страница сведений.

Ниже я только что добавил, как мне кажется, соответствующий код для отладки этой ошибки, которую я получаю при сборке. Если вам нужно больше фрагментов, тогда я с радостью предоставлю!

Правда, я действительно не знаю, как работает загрузчик - пока просто следую инструкциям и документации.

Мой код следующим образом:

Bootstrapper.cs

namespace CleverBot
{
    class Bootstrapper : BootstrapperBase
    {
        private readonly SimpleContainer _container = new SimpleContainer();
        public Bootstrapper()
        {
            Initialize();
        }

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

        protected override void Configure()
        {
            _container.Singleton<IEventAggregator, EventAggregator>();
            _container.RegisterPerRequest(typeof(DetailedDocumentViewModel), null, typeof(DetailedDocumentViewModel));
            _container.RegisterPerRequest(typeof(SearchPageViewModel), null, typeof(SearchPageViewModel));
            _container.RegisterPerRequest(typeof(SearchResultsViewModel), null, typeof(SearchResultsViewModel));
            _container.RegisterPerRequest(typeof(ShellViewModel), null, typeof(ShellViewModel));

        }
        protected override object GetInstance(Type serviceType, string key)
        {
            return _container.GetInstance(serviceType, key);
        }

        protected override IEnumerable<object> GetAllInstances(Type serviceType)
        {
            return _container.GetAllInstances(serviceType);
        }

        protected override void BuildUp(object instance)
        {
            _container.BuildUp(instance);
        }
    }
}

И мой ShellViewModel.cs выглядит так:

namespace CleverBot.ViewModels
{
    public class ShellViewModel : Conductor<object>
    {
        private readonly IEventAggregator _eventAggregator;
        public ShellViewModel(IEventAggregator eventAggregator)
        {
            _eventAggregator = eventAggregator;
            Startup.Init<SolrModel>("http://localhost:8983/solr/brain_drive");
            ShowSearchPage();
        }

        public void ShowSearchPage()
        {
            ActivateItem(new SearchPageViewModel(_eventAggregator));
        }

    }
}
* 1018 И, наконец, мой SearchPageViewModel.cs выглядит следующим образом:
namespace CleverBot.ViewModels
{
    public class SearchPageViewModel : PropertyChangedBase
    {
        private string _searchTerm;
        private readonly IEventAggregator _eventAggregator;

        public SearchPageViewModel(IEventAggregator eventAggregator)
        {
            _eventAggregator = eventAggregator;
        }

        public string SearchTerm
        {
            get { return _searchTerm; }
            set
            {
                _searchTerm = value;
                NotifyOfPropertyChange(() => SearchTerm);
            }
        }
        public void BasicSearchButton()
        {
            // Build the new query object
            var queryResult = new SolrQuery(_searchTerm);

            // Execute the query, while also applying all the options
            var Result = ExecuteQuery(queryResult);

            // Publish the result, to be picked up by SearchResults VM
            _eventAggregator.PublishOnUIThread(Result);
        }

        private SolrQueryResults<SolrModel> ExecuteQuery(SolrQuery query)
        {
            var solr = CommonServiceLocator.ServiceLocator.Current.GetInstance<ISolrOperations<SolrModel>>();

            QueryOptions options = getQueryOptions();

            var docs = solr.Query(query, options);

            return docs;
        }

        private QueryOptions getQueryOptions()
        {
            var facetPivotQuery = new SolrFacetPivotQuery()
            {
                Fields = new[] { new PivotFields("created_year", "created_month") },
                MinCount = 1
            };

            QueryOptions options = new QueryOptions
            {
                Facet = new FacetParameters
                {
                    Queries = new ISolrFacetQuery[]
                    {
                        new SolrFacetFieldQuery("type"),
                        new SolrFacetFieldQuery("source"),
                        facetPivotQuery
                    }
                },
                Highlight = new HighlightingParameters
                {
                    Fields = new[] { "text", "id", "author" },
                    Fragsize = 150,
                    Snippets = 200,
                    MaxAnalyzedChars = -1
                }
            };

            return options;
        }
    }
}

Может ли кто-нибудь пролить свет на причину ошибки System.NullReferenceException? Я знаю, что это значит, но я не понимаю, как я это понимаю, потому что только начинаю с этой платформы.

Заранее спасибо!

1 Ответ

0 голосов
/ 09 апреля 2020

Похоже, я должен был зарегистрировать следующее:

_container.Singleton<IWindowManager, WindowManager>();

в моем bootstrapper.cs, так что теперь это выглядит так:

namespace CleverBot
{
    class Bootstrapper : BootstrapperBase
    {
        private SimpleContainer _container = new SimpleContainer();
        public Bootstrapper()
        {
            Initialize();
        }

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

        protected override void Configure()
        {
            _container.Singleton<IEventAggregator, EventAggregator>();

            // THE FOLLOWING WAS ADDED
            _container.Singleton<IWindowManager, WindowManager>();

            GetType().Assembly.GetTypes()
                .Where(type => type.IsClass)
                .Where(type => type.Name.EndsWith("ViewModel"))
                .ToList()
                .ForEach(viewModelType => _container.RegisterPerRequest(
                    viewModelType, viewModelType.ToString(), viewModelType));

        }
        protected override object GetInstance(Type serviceType, string key)
        {
            return _container.GetInstance(serviceType, key);
        }

        protected override IEnumerable<object> GetAllInstances(Type serviceType)
        {
            return _container.GetAllInstances(serviceType);
        }

        protected override void BuildUp(object instance)
        {
            _container.BuildUp(instance);
        }
    }
}
...