结构图:扫描文件夹,按名称实例化类(对于<itest> .Use(string))</itest>

时间:2012-03-05 20:33:05

标签: c# .net ioc-container structuremap

我正在尝试使用Structuremap,这让我很难,因为结构地图网站上的文档很旧(大多数时候我使用提供的代码,我在VS中得到一个过时的消息。 ..)

无论如何,我试图提供这样的东西:

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

这段代码工作正常,但现在我正在尝试在这个项目中没有Class“Test2”的情况下实现同样的目标。 我的目标是: 我想拥有一个包含各种.dll的文件夹,它提供了ITest-Methods(如Test1,Test2,Test3,aso)。 Structuremap应该注册那些dll(x.Scan(s =&gt; 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() - Method,它给了我:

  

ITest(smTests.ITest)TestExample1.FirstName,TestExample1,   Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null配置的实例   TestExample1.FirstName,TestExample1,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null   Scoped as:Transient

由此我非常肯定我必须使用TestExample1.FirstName。 但是我怎么能在第一时间创建一个实例?

谢谢!

1 个答案:

答案 0 :(得分:0)

这应该为您提供按名称注册和获取所有类型的功能:

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);
    }
}