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)()
Надеюсь это поможет.