Как преобразовать инициализацию C # StructureMap в VB.NET?

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

private static void InitStructureMap()
    {
        ObjectFactory.Initialize(x =>
                                     {
                                         x.AddRegistry(new DataAccessRegistry());
                                         x.AddRegistry(new CoreRegistry());
                                         x.AddRegistry(new WebUIRegistry());

                                         x.Scan(scanner =>
                                                    {
                                                        scanner.Assembly("RPMWare.Core");
                                                        scanner.Assembly("RPMWare.Core.DataAccess");
                                                        scanner.WithDefaultConventions();
                                                    });
                                     });
    }
14.12.2008 19:09:37
4 ОТВЕТА
РЕШЕНИЕ

На данный момент это просто невозможно. Текущая версия VB не поддерживает многострочные (или операторные) лямбды. Каждая лямбда может содержать только одно выражение. Следующая версия VB исправит это (в последнем выпуске просто не хватило времени).

В то же время вам придется обойтись с делегатом:

Private Shared Sub Foobar(x As IInitializationExpression)
    x.AddRegistry(New DataAccessRegistry)
    x.AddRegistry(New CoreRegistry)
    x.AddRegistry(New WebUIRegistry)
    x.Scan(AddressOf Barfoo)
End Sub

Private Shared Sub Barfoo(ByVal scanner As IAssemblyScanner) 
    scanner.Assembly("RPMWare.Core")
    scanner.Assembly("RPMWare.Core.DataAccess")
    scanner.WithDefaultConventions
End Sub

' … '
ObjectFactory.Initialize(AddressOf Foobar)
9
17.12.2008 08:26:37
Спасибо за ответ. Это работает, и я отметил это как так. Быстрое продолжение. Я получаю предупреждение, что не все пути кода возвращают значение. Есть ли способ избежать этого?
Kyle West 14.12.2008 22:35:51
Измените функцию на Sub, если она не имеет возвращаемого значения. Если оно имеет возвращаемое значение, убедитесь, что оно возвращает значения во всех путях кода и во всех случаях.
configurator 14.12.2008 22:51:00
@ Кайл: прости. Код на самом деле не должен был компилироваться (проверьте Option Strict Onваши параметры и всегда используйте его!), Потому что функциям не хватало возвращаемых значений - что требует использования Subв VB, как правильно предложил «конфигуратор».
Konrad Rudolph 14.12.2008 23:17:11
Спасибо. Я бы включил строго, но затем я потратил бы следующие пару дней, чтобы проект был собран снова. К счастью, это небольшое и общее количество нашего общего решения в этом проекте VB.NET. Понятия не имею, почему мы начали с VB. У кого-то было слишком много помощи.
Kyle West 15.12.2008 06:06:23
@ Кайл: Конечно, я не могу судить о вашем особом случае, но очистка проекта может стоить боли, потому что это облегчает ее позже.
Konrad Rudolph 15.12.2008 20:54:45

Мой VB.NET не на пустом месте, поэтому я не могу помочь вам с кодом напрямую. Однако я могу сказать вам, как сделать это самостоятельно, и это глупо. По сути, вам нужно использовать Reflector для чтения исполняемого файла, в котором содержится этот код - и затем вы можете выбрать вывод его как VB.NET - насколько это круто, и этот прием работает в обоих направлениях.

1
14.12.2008 19:28:13

Это здорово, по какой-то причине, но не компилируется. Тьфу.

Вот что из этого вышло:

Private Shared Sub InitStructureMap()
ObjectFactory.Initialize(Function (ByVal x As IInitializationExpression) 
    x.AddRegistry(New DataAccessRegistry)
    x.AddRegistry(New CoreRegistry)
    x.AddRegistry(New WebUIRegistry)
    x.Scan(Function (ByVal scanner As IAssemblyScanner) 
        scanner.Assembly("RPMWare.Core")
        scanner.Assembly("RPMWare.Core.DataAccess")
        scanner.WithDefaultConventions
    End Function)
End Function)
End Sub

И я попытался добавить _, чтобы сделать его одной строкой (это тоже не сработало)

 Private Shared Sub InitStructureMap()
ObjectFactory.Initialize(Function (ByVal x As IInitializationExpression) _
    x.AddRegistry(New DataAccessRegistry) _
    x.AddRegistry(New CoreRegistry) _
    x.AddRegistry(New WebUIRegistry) _
    x.Scan(Function (ByVal scanner As IAssemblyScanner) _
    scanner.Assembly("RPMWare.Core") _
    scanner.Assembly("RPMWare.Core.DataAccess") _
    scanner.WithDefaultConventions() _
    End Function) _
End Function) 
End Sub

Кто-нибудь еще ненавидит их старые приложения? :П

0
14.12.2008 19:39:21

Вы можете увидеть другой подход по адресу:

http://blogs.lessthandot.com/index.php/DesktopDev/MSTech/structuremap-is-way-cool-even-in-vb-net

2
13.05.2009 22:44:05