Структура карты: папка сканирования, создание экземпляра класса по имени (для <ITest>.Использование (строка)) - PullRequest
1 голос
/ 06 марта 2012

Я пытаюсь использовать Structuremap, что доставляет мне немало хлопот, поскольку документация на сайте struct-map-site довольно старая (в большинстве случаев, когда я работаю с предоставленным кодом, я получаю устаревшее сообщение в VS...)

В любом случае, я пытаюсь представить что-то вроде этого:

private static ITest GetInstance()
{
    return (new Container(x => x.For<ITest>().Use<Test2>())).GetInstance<ITest>();
}

Этот фрагмент кода работает нормально, НО теперь я пытаюсь достичь того же самого безКласс "Test2" в этом проекте.Моя цель: я хочу иметь папку со всеми видами .dll, которая предоставляет ITest-методы (такие как Test1, Test2, Test3, aso).Structuremap должен регистрировать эти dll (x.Scan (s => s.AddAllTypesOf)), и с помощью простой строки я хочу сказать моему приложению использовать «Test2».

Вот моя идея в форме кода (не работает):

public static class TestHandler
{
    static TestHandler()
    {
        Tests = new Container();
        Tests.Configure(x => x.Scan(scanner =>
                                        {
                                            scanner.AssembliesFromPath(@"TestCases");
                                            scanner.AddAllTypesOf<ITest>();
                                            scanner.LookForRegistries();
                                        }));
    }
    public static Container Tests { get; set; }

    public static ITest GetHandler(string handlerName)
    {
        return Tests.Configure(x => x.For<ITest>().Use(handlerName)))
.GetInstance<ITest>(handlerName);
    }
}

Итак, как я могу создать объект, который я могу затем передать .Использовать?И какую переменную мне в любом случае нужно передать?

Если бы мне пришлось угадывать, я бы сказал один из них:

  • Полное имя сборки
  • Простоимя класса (которое в данном случае было бы Test2)
  • AssemblyName.ClassName

Я попробовал метод WhatDoIhave (), который дает мне:

ITest (smTests.ITest) TestExample1.FirstName, TestExample1, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null Настроенный экземпляр TestExample1.FirstName, TestExample1, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = nullИмеет вид: Transient

Исходя из этого, я вполне уверен, что мне нужно использовать TestExample1.FirstName.Но как я могу создать экземпляр в первую очередь?

Спасибо!

1 Ответ

0 голосов
/ 07 марта 2012

Это должно предоставить вам функциональность для регистрации и получения всех типов по имени:

public static class TestHandler
{
    static TestHandler()
    {
        Tests = new Container();
        Tests.Configure(x => x.Scan(scanner =>
            {
                scanner.AssembliesFromPath(@"TestCases");
                scanner.AddAllTypesOf<ITest>().NameBy(i => i.Name);
            }));
    }

    public static IContainer Tests { get; set; }

    public static ITest GetHandler(string handlerName)
    {
        return Tests.GetNamedInstance<ITest>(handlerName);
    }
}
...