Изменяет ли 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).Затем я переключаю значение MyBool (на True) и печатаю его снова.
Однако в обработчике событий PropertyChanged значение MyBool печатается как False, что является старым значением.
Такое поведение является неожиданным, поскольку BindableBase.SetProperty предназначен для запуска PropertyChanged после обновления значения. Я ожидал, что значение, напечатанное в обработчике PropertyChanged, всегда будет соответствовать обновленному значению, но это не так.
Моя гипотеза:
Я подозреваю, что VirtualMethodInterceptor Unity изменяет поведение SetProperty одним из следующих способов:
Изменение порядка операций: перехватчик может вставлять логику между назначением свойства и вызовом OnPropertyChanged, вызывая событие, которое должно быть вызвано до обновления значения.
Переопределение метода: перехватчик может оборачивать или переопределять метод SetProperty, что может помешать его ожидаемому поведению.
Что я делаю? Пробовал:
Отключение перехватчика: если я удалю вызов SetInterceptorFor, проблема не возникнет.
Непосредственный вызов SetProperty: без перехвата выходные данные соответствует моим ожиданиям.
Запись вызовов методов: я пытался записать порядок вызова методов, но не смог точно определить, где меняется поведение.
Мои вопросы:
1.Изменяет ли VirtualMethodInterceptor Unity поведение таких методов, как SetProperty в BindableBase Prism?

2.Если да, то как?
3.Есть ли способ настроить перехватчик, чтобы избежать вмешательства в SetProperty?
4.Существуют ли какие-либо рекомендуемые методы проверки того, как перехват Unity влияет на поведение метода?

Подробнее здесь: https://stackoverflow.com/questions/793 ... roperty-me
Ответить

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

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

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

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

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