【问题标题】:Structuremap: Retrieving all concrete classes of a given interface by nameStructuremap:按名称检索给定接口的所有具体类
【发布时间】:2011-11-23 11:32:24
【问题描述】:

我希望能够检索已在 Structuremap 中以给定名称配置的特定接口的所有实例。

我已经在项目中使用 Structuremap 进行构造函数注入,这似乎是我应该能够用它完成的事情。

例如:我有一个接口IProcessor,许多具体类都实现了该接口。每个具体类都有一个名称,其中一些类共享相同的名称。对于给定的名称,我希望能够返回 IProcessor 的所有具体实例。

IEnumerable<IProcessor> processors = ProcessorsByName("foo");

ProcessorsByName(string name)
{
    // Some Structuremap magic here
    // Ideally something like (which I know doesn't exist)
    return ObjectFactory.GetAllNamedInstances<IProcessor>(name);
}

我知道我可以打电话给ObjectFactory.GetAllInstances&lt;IProcessor&gt;(),然后枚举测试每一个,看看它是否是正确的名字,但这听起来很浪费。

// Possible solution
interface IProcessor
{
    string Name { get; }
}

IEnumerable<IProcessor> processors = ProcessorsByName("foo");

ProcessorsByName(string name)
{
    // Having a dog and barking yourself
    return ObjectFactory.GetAllInstances<IProcessor>().Where(p => p.Name == name);
}

【问题讨论】:

  • StructureMap 不支持多个同名实例。您将不得不在它之上实现自己的机制。如果您需要按名称对实例进行分组,您提出的解决方案可以正常工作。如果您描述了您要解决的问题,除了按名称分组之外,可能还有其他解决方案。

标签: .net configuration structuremap


【解决方案1】:

一种方式:

public sealed class MyRegistry : Registry
{
    public MyRegistry()
        : base()
    {

        For<IProcessor>()
            .Use<FooProcessor>().Named("Foo");

【讨论】:

  • 我需要能够获得一个IEnumerable&lt;IProcessor&gt; 而不一定只是一个给定的name
  • 我的错..我误读了这个问题。您始终可以正确地使用自己的扩展方法来获取“名称”参数,或修改源代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-13
  • 1970-01-01
  • 1970-01-01
  • 2018-03-20
  • 1970-01-01
  • 2013-04-19
相关资源
最近更新 更多