Как преобразовать инициализацию C # StructureMap в VB.NET? - PullRequest
4 голосов
/ 14 декабря 2008

Я собираюсь положить голову через эту раздвижную стеклянную дверь. Я не могу понять, как выполнить следующий код в 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();
                                                    });
                                     });
    }

Ответы [ 4 ]

9 голосов
/ 14 декабря 2008

На данный момент это просто невозможно. Текущая версия 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)
2 голосов
/ 14 мая 2009

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

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

1 голос
/ 14 декабря 2008

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

0 голосов
/ 14 декабря 2008

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

Вот что получилось:

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

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

...