结构映射:扫描文件夹,按名称实例化类(对于<;ITest>;.使用(字符串))

本文关键字:lt 对于 gt 字符串 使用 ITest 文件夹 扫描 映射 实例化 结构 | 更新日期: 2023-09-27 18:26:40

我正在尝试使用Structuremap,这给我带来了困难,因为结构图网站上的文档很旧(大多数时候我使用提供的代码,我在VS中收到一条过时的消息…)

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

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

这段代码运行得很好,但现在我正试图在这个项目中不使用类"Test2"来实现同样的事情。我的目标是:我想要一个包含各种.dlls的文件夹,它提供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)
  • 程序集名称.ClassName

我尝试了WhatDoIhave()-方法,它给了我:

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范围为:瞬态

因此,我非常肯定我必须使用TestExample1.FirstName。但是,我如何首先创建实例?

谢谢!

结构映射:扫描文件夹,按名称实例化类(对于<;ITest>;.使用(字符串))

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

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