Unity Application Block - пример преобразования из C # в VB - PullRequest
1 голос
/ 20 сентября 2010

Я пытался преобразовать WPF Starter Kit из C # в VB.net, и у меня все хорошо, за исключением одной области ... Внедрение зависимостей с помощью блока приложений Unity.

У меня есть следующий блок кода C #:

            Type viewModelType = viewModelAssembly.GetType(action.ViewModelTypeName);

            var notificationPolicy = unity.AddNewExtension<Interception>()
                .RegisterType(typeof(BaseViewModel), viewModelType, action.Name)
                .Configure<Interception>()
                .SetDefaultInterceptorFor(viewModelType, new VirtualMethodInterceptor())
                .AddPolicy("NotificationPolicy");

            notificationPolicy.AddMatchingRule(new PropertyMatchingRule("*", PropertyMatchingOption.Set));
            notificationPolicy.AddCallHandler<NotifyPropertyChangedCallHandler>();

, который я автоматически конвертирую в vb.net:

Dim viewModelType As Type = viewModelAssembly.[GetType](action.ViewModelTypeName)

Dim notificationPolicy = unity.AddNewExtension(Of Interception()).RegisterType(GetType(BaseViewModel), viewModelType, action.Name).Configure(Of Interception)().SetDefaultInterceptorFor(viewModelType, New VirtualMethodInterceptor()).AddPolicy("NotificationPolicy")

notificationPolicy.AddMatchingRule(New PropertyMatchingRule("*", PropertyMatchingOption.[Set]))
notificationPolicy.AddCallHandler(Of NotifyPropertyChangedCallHandler)()

Код vb.net генерирует ошибку«Разрешение перегрузки с задержкой не может быть применено к« RegisterType », потому что экземпляр доступа имеет тип интерфейса», и я понятия не имею, как я могу это исправить.Я совершенно новичок в этом Unity, и я не могу найти примеры VB - кроме фрагментов, которые предлагает MS.Любая помощь будет принята с благодарностью.

Спасибо всем,

Райан

РЕДАКТИРОВАТЬ: Per Blam, я добавил дополнительную скобку, но я все еще получаю ту же ошибку.

Ответы [ 3 ]

1 голос
/ 20 сентября 2010

Я не вижу, как это компилируется, если отсутствует скобка:

 Dim notificationPolicy = unity.AddNewExtension(Of Interception()) _
.RegisterType(GetType(BaseViewModel), viewModelType, action.Name) _
.Configure(Of Interception)() _
.SetDefaultInterceptorFor(viewModelType, New VirtualMethodInterceptor()) _
.AddPolicy("NotificationPolicy")

Кронштейн здесь:

AddNewExtension (Of Interception () ) .Register ...

0 голосов
/ 24 сентября 2010

Я использую Red-Gate Reflector, чтобы увидеть, как код выглядит на разных языках.Хотя иногда это не дает лучшего кода.

0 голосов
/ 24 сентября 2010

Ваш код VB выглядит нормально.Здесь могут быть две разные проблемы.Во-первых, вы используете Unity 2.0?Есть ли в вашем файле .vb «Imports Microsoft.Practices.Unity» вверху?Большинство перегрузок в RegisterType определяются как методы расширения интерфейса, без этого оператора Imports компилятор не будет их видеть.

Вторая проблема может быть связана с этой строкой:

DimtificationPolicy= ...

Обратите внимание, что здесь нет типа, поэтому VB должен угадать.По умолчанию, я думаю, что он угадывает объект и возвращается к поздним связанным вещам.

У вас есть несколько вариантов здесь.

Сначала добавьте «Option Infer On» в верхней части вашего.VB файл.Это включит вывод типа.

Если это не сработает, измените код, чтобы объявить тип.В этом случае это будет:

DimtificationPolicy as PolicyDefinition = ...

Или, наконец, вы можете просто объединить две последние строки кода вместе и забыть о переменной.Сделайте это вместо:

unity.AddNewExtension(Of Interception()) _
    .RegisterType(GetType(BaseViewModel), viewMOdelType, action.Name) _
    .Configure(Of Interception)() _
    .SetDefaultInterceptorFor(viewModelType, new VirtualMethodInterceptor()) _
    .AddPolicy("NotificationPolicy") _
        .AddMatchingRule(new PropertyMatchingRule("*", PropertyMatchingOption.[Set])) _
        .AddCallHandler(Of NotifyPropertyChangedCallHandler)()

Надеюсь, это поможет.

...