【问题标题】:Structuremap: Scan Folder, instantiate Class by name (For<ITest>.Use(string))Structuremap:扫描文件夹,按名称实例化类 (For<ITest>.Use(string))
【发布时间】:2012-03-05 20:33:05
【问题描述】:

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

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

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

这段代码工作正常,但现在我试图在这个项目中没有“Test2”类的情况下实现同样的目标。 我的目标是: 我想要一个包含各种 .dll 的文件夹,它提供 ITest-Methods(如 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=neutral, PublicKeyToken=null 配置的实例 TestExample1.FirstName,TestExample1,版本=1.0.0.0,文化=中性,PublicKeyToken=null 作用域:瞬态

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

谢谢!

【问题讨论】:

    标签: c# .net ioc-container structuremap


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多