Очистить все регионы / просмотры Prism 4 (Silverlight) Выйти - PullRequest
1 голос
/ 21 февраля 2011

У меня есть 2 области в приложении Silverlight, использующих призму 4 и вид основной оболочки Unity, область Аутентифицированная и Неаутентифицированная область, и пункт меню.

В аутентифицированной области есть многобольше субрегионов в зависимости от представления, внедренного в него.

При загрузке приложения мне будет отображаться экран входа в систему «Неаутентифицированный регион», при входе я буду представлен в области Аутентифицированный.

Когда я нажимаю на кнопку выхода из меню, мне снова будет представлен вид входа в систему.

Но когда я вхожу во второй раз, мой существующий вид загружается в аутентифицированном регионевсе еще там.

Я попытался при выходе из системы выполнить следующий код, чтобы удалить все представления из этого региона, но представления, извлеченные из контейнера, все еще являются существующими представлениями.

        var regions = this.RegionManager.Regions;
        foreach (var region in regions)
        {
            if (region.Name == this.AuthenticatedRegionName)
            {                    
                var views = region.Views;

                foreach(var view in views)
                {
                    region.Remove(view);                        
                }                    
            }
        }

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

Как я могу сказать единство, чтобы избавиться от всех представлений?

Ответы [ 2 ]

1 голос
/ 22 февраля 2011

Я решил это, пройдя по UnityContainer.Registration и проверив LifetimeManagerType каждой регистрации, если они имеют ContainerControlledLifetimeManager и MappedToType равны моему типу модели базового представления, я создаю для него новый экземпляр, поэтому задаю ему значениеустановленное значение в LOGOUT.

var registrations = this.UnityContainer.Registrations;
            if (registrations != null)
            {
                foreach (var registration in registrations)
                {
                    if (registration.LifetimeManagerType != null &&
                        registration.LifetimeManagerType ==               typeof(ContainerControlledLifetimeManager) &&
                        registration.MappedToType.FullName.Equals("Main.ViewModelBase"))
                    {
                        var objectType = registration.LifetimeManager.GetValue().GetType();
                        var newInstance = Activator.CreateInstance(objectType, new object[]{this.UnityContainer});

                        registration.LifetimeManager.SetValue(newInstance);                           
                    }
                }
            }

Не элегантно, но пока работает, ура

1 голос
/ 21 февраля 2011

Поскольку вы используете ContainerControlledLifetimeManager для представления, представление будет преобразовываться в тот же экземпляр в течение срока действия IUnityContainer. Удаление вида из региона никоим образом не удаляет его из IUnityContainer, поскольку IUnityContainer содержит сильную ссылку на вид.

Лучший подход - не заставлять ваши Представления вести себя как Синглтон. Если вы хотите поведение Singleton, отправьте это поведение в Service или ViewModel, которые могут оставаться в течение жизни IUnityContainer без каких-либо побочных эффектов.

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

Если вы уверены, что хотите, чтобы поведение Singleton было в вашем представлении, вы можете использовать ExternallyControlledLifetimeManager, который будет содержать слабую ссылку на представление. После этого все представления будут удалены из GC, если все сильные ссылки на него удалены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...