Изменяет ли Unity Interceptor поведение метода BindableBase.SetProperty Prism?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Изменяет ли Unity Interceptor поведение метода BindableBase.SetProperty Prism?

Сообщение Anonymous »

Я использую контейнер Unity с классом BindableBase Prism и подозреваю, что VirtualMethodInterceptor Unity изменяет поведение метода SetProperty в BindableBase. Похоже, это приводит к изменению порядка назначения свойств и вызова события PropertyChanged, что приводит к неожиданным результатам.
Вот соответствующий код:
Точка входа в программу

Код: Выделить всё

internal class Program
{
static void Main(string[] args)
{
IUnityContainer container = new UnityContainer();
container.AddNewExtension();
container.RegisterType();
container.Configure()
.SetInterceptorFor(new VirtualMethodInterceptor());

var bll = container.Resolve();
bll.PropertyChanged += Bll_PropertyChanged;
bll.GetMenus();
Console.ReadLine();
}

private static void Bll_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
if (e.PropertyName == nameof(MenuBll.MyBool))
{
MenuBll bll = (MenuBll)sender;
Console.WriteLine("MyBool in PropertyChanged: " + bll.MyBool);
}
}
}
Реализация MenuBll

Код: Выделить всё

public class MenuBll : BindableBase, INotifyPropertyChanged
{
[LogHandlerAttribute]
public virtual void GetMenus()
{
Console.WriteLine($"MyBool in method: {MyBool}");
MyBool = !MyBool;
Console.WriteLine($"MyBool now: {MyBool}");
}

private bool myBool = false;
public bool MyBool
{
get => myBool;
set
{
SetProperty(ref myBool, value);
}
}
}
когда я запускаю код, я получаю следующий результат:

Код: Выделить всё

MyBool in method: False

MyBool in PropertyChanged: False

MyBool now: True
Вот что происходит шаг за шагом:
Внутри метода GetMenus я сначала печатаю текущее значение MyBool (которое равно False).< /p>
Затем я переключаю значение MyBool (на True) и печатаю его снова.
Однако в обработчике событий PropertyChanged значение MyBool печатается как False, что является старый value.
Такое поведение является неожиданным, поскольку BindableBase.SetProperty предназначен для запуска PropertyChanged после обновления значения. Я ожидал, что значение, напечатанное в обработчике PropertyChanged, всегда будет соответствовать обновленному значению, но это не так.
Моя гипотеза:
Я подозреваю, что VirtualMethodInterceptor Unity изменяет поведение SetProperty одним из следующих способов:
Изменение порядка операций: перехватчик может вставлять логику между назначением свойства и вызовом OnPropertyChanged, вызывая событие, которое будет вызвано перед обновлением значения.
Переопределение метода: перехватчик может оборачивать или переопределять метод SetProperty, что может помешать его ожидаемому поведению.
Что я пробовал:
  • Отключение перехватчика: если я удалю вызов SetInterceptorFor\, проблема не происходят.
  • Непосредственный вызов SetProperty: без перехвата, выходные данные согласованы и соответствуют моим ожиданиям.
  • Запись вызовов метода: я попытался зарегистрировать метод порядок вызова, но не смог точно определить, где меняется поведение.
Мои вопросы:
  • Изменяет ли VirtualMethodInterceptor в Unity поведение таких методов, как SetProperty в BindableBase Prism?
  • Если да, то как?
  • Есть ли способ настроить перехватчик, чтобы он не мешал SetProperty?
  • Существуют ли какие-либо рекомендуемые методы проверки того, как перехват Unity влияет на поведение метода?


Подробнее здесь: https://stackoverflow.com/questions/793 ... property-m
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Изменяет ли Unity Interceptor поведение метода BindableBase.SetProperty Prism?
    Anonymous » » в форуме C#
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Как добавить поведение на DataTemplate управления, когда я кодирую C#, WPF + Prism
    Anonymous » » в форуме C#
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous
  • Как добавить поведение на DataTemplate управления, когда я кодирую C#, WPF + Prism
    Anonymous » » в форуме C#
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous
  • Используйте Prism.Unity в качестве DI для AspNet.Core
    Anonymous » » в форуме C#
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Используйте Prism.Unity в качестве DI для ASP.NET Core
    Anonymous » » в форуме C#
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»