Замок Виндзорский перехватчик на Caliburn Посмотреть модель - PullRequest
0 голосов
/ 12 февраля 2012

Я хотел бы создать собственные аспекты с помощью 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.

Так что же является правильным способом?

Спасибо за помощь

Ответы [ 2 ]

1 голос
/ 09 мая 2012

Как насчет этого?

void Hack()
{
    var existing = ViewLocator.TransformName;
    ViewLocator.TransformName = (s, o) =>
                                existing(s.EndsWith("Proxy")
                                            ? s.Substring(0, s.Length - "Proxy".Length)
                                            : s, o);
}
0 голосов
/ 04 марта 2013

Самый простой способ (и, вероятно, надежный) - предложить ViewLocator Caliburn использовать не тип прокси модели представления, а тип прокси-модели представления:

public static void AddViewLocatorRuleForProxiedViewModels()
{
    var originalViewTypeLocator = ViewLocator.LocateTypeForModelType;

    ViewLocator.LocateTypeForModelType = (modelType, displayLocation, context) =>
    {
        var viewModelType = modelType;

        var viewModelTypeName = viewModelType.FullName;
        if (viewModelTypeName.StartsWith("Castle.Proxies") && viewModelTypeName.EndsWith("Proxy"))
            viewModelType = viewModelType.BaseType;

        return originalViewTypeLocator(viewModelType, displayLocation, context);
    };
}
...