Unity Application Block - пример преобразования из C# в VB

Я пытался преобразовать 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 генерирует ошибку "Разрешение перегрузки Latebound не может быть применено к" RegisterType ", потому что доступ к экземпляру является типом интерфейса", и я понятия не имею, как я могу это исправить. Я совершенно новичок в этом Unity, и я не могу найти примеры VB - кроме фрагментов, которые предлагает MS. Любая помощь будет принята с благодарностью.

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

Райан

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

3 ответа

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

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

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

AddNewExtension (Of Interception ()).Регистрация...

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

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

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

DimtificationPolicy = ...

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

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

Сначала добавьте "Option Infer On" в начало вашего файла.vb. Это включит вывод типа.

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

Тусклое уведомление Policy 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)()

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

Другие вопросы по тегам