如何注入在StructureMap中实现某个通用接口的对象列表?

问题描述 投票:1回答:1

我有两个界面:

public interface IResult
{}

public interface IDataFetcher<T> where T : IResult
{
   T Fetch();
}

在我的处理程序中,我想注入实现IDataFetcher<T>的服务:

public class MyHandler
{
    public MyHandler(IEnumerable<IDataFetcher<IResult>> fetchers)
    {
        // etc.
    }
}

我目前正在按以下方式注册IDataFetchers

public MyRegistry()
{
    Scan(scan =>
    {
        scan.Assembly("name_of_assembly_containg_all_the_classes");
        scan.AddAllTypesOf<IResult>();
        scan.ConnectImplementationsToTypesClosing(typeof(IDataFetchers<>));
    });
}

[当我在MyHandler的构造函数中设置断点时,fetchers变量为空(不为null)

我需要做什么来解决此问题?确保获取程序充满了IDataFetcher的实现?

c# structuremap
1个回答
0
投票

经过数小时的尝试和谷歌搜索,我找到了答案。我做的一切正确,除了一件事:使IDataFetcher协变:

public interface IDataFetcher<out T> where T : IResult
{}

这很合理,因为我在泛型类型中使用了具体类型:

public class SomeClass : IResult
{
}

public class ConcreteFetcher : IDataFetcher<SomeClass>
{
    public SomeClass Fetch()
    {
        // do something
    }
}

干杯!

© www.soinside.com 2019 - 2024. All rights reserved.