如何使用 StructureMap 在构造函数中注入所有 类 实现相同的通用接口?

How to inject all classes implementing the same generic interface in the constructor using StructureMap?

我有一堆数据提取器,它们都具有几乎相同的签名。唯一不同的是 return 类型。 return 类型指定为 T:

我有这个界面:

public interface IDataFetcher<T>
{
    T FetchData(MyObject data);
}

接下来我有大约10个这个接口的实现。在调用代码中,我想做这样的事情:

public class FetchCommandHandler
{
    private readonly IEnumerable<IDataFetcher<T>> _fetchers;

    public FetchCommandHandler(IEnumerable<IDataFetcher<T>> fetchers) // this of course does not work
    {
        _fetchers = fetchers;
    }

    public MyResult Handle()
    {
        var myObj = new MyObject(); // get object from database

        foreach(var fetcher in _fetchers)
        {
           var result = fetcher.FetchData(myObj);
           // do something with result
        }
    }
}

所以,最后,我想要的是不必在构造函数中注入每个 DataFetcher<T> 实现。我正在寻找一种方法来从 StructureMap 中检索 IDataFetcher<T> 的所有注册。

我对实现相同结果的所有其他设计持开放态度,即不在构造函数中注入每个实现。

我们能做的是为 return 类型引入另一个接口,所有将 returned 的类型都将实现它。

定义接口:

public interface IData
{
}

public interface IDataFetcher<T> where T : IData
{
    T FetchData(MyObject data);
}

例如一个类型returned:

public class FooData : IData
{
}

它的 DataFetcher 实现如下所示:

public class FooDataFetcher : IDataFetcher<FooData>
{
     public FooData FetchData(MyObject data)
     {
       // logic here and return instance of FooData
     }
}

现在我们可以做的是定义处理程序 class 类似于:

public class FetchCommandHandler
{
    private readonly IEnumerable<IDataFetcher<IData>> _fetchers;

    public FetchCommandHandler(IEnumerable<IDataFetcher<IData>> fetchers) // this of course does not work
    {
        _fetchers = fetchers;
    }

    public MyResult Handle()
    {
        var myObj = new MyObject(); // get object from database

        foreach(var fetcher in _fetchers)
        {
           var result = fetcher.FetchData(myObj);
           // do something with result
        }
    }
}