Я хотел бы создать собственные аспекты с помощью Castle Windsor Interceptor и применить его к классам View Model.
Как я уже говорил, я использую Caliburn MVVM Framework, а на DI я использую Caste Windsor.Все работает хорошо.
Например, я создал простые перехватчики регистрации, вот:
public class LoggingInterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
Console.Write("Log: Method Called: " + invocation.Method.Name);
invocation.Proceed();
}
}
Это простой класс View Model - это "элемент табуляции":
public class TabViewModel : Screen,
ITabViewModel
{
}
Когда я настраиваю IoC с Fluent API, я хотел бы применить этот перехватчик в классе View Model.
container.Register(Component
.For<LoggingInterceptor>()
.LifeStyle
.Singleton
.Named("LogAspect"));
container.Register(Component
.For<ITabViewModel>()
.ImplementedBy<TabViewModel>()
.LifeStyle
.Transient
.Named("TabViewModel")
.Interceptors<LoggingInterceptor>());
Когда я попытался выбрать модель представления из IoC:
var tabItem = IoC.Get<ITabViewModel>();
ActivateItem(tabItem);
я получилэто сообщение:
Не найдено представление по умолчанию для Castle.Proxies.ITabViewModelProxy.Поисковые запросы включают в себя: Castle.Proxies.IITabViewModelProxy Castle.Proxies.ITabViewModelProxys.IDefault Castle.Proxies.ITabViewModelProxys.Default
Также я пробовал этот способ для применения перехватчика.
[Interceptor(typeof(LoggingInterceptor))]
public class TabViewModel : Screen,
ITabViewModel
{
}
Хорошо, я знаю, что платформа Caliburn соответствует View и View Model по соглашению об именах.
Когда я пытаюсь выбрать реализацию ITabViewModel, я получаю ITabViewModelProxy, а для ITabViewModelProxy я не регистрирую никакого View.
Цель прокси-сервера - TabViewModel, но я думаю, что проблема заключается в несоответствии имен.
Я не хочу переименовывать ViewModel, потому что я хотел бы настроить прокси из файлов XML.
Так что же является правильным способом?
Спасибо за помощь