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

我有一堆数据读取器,它们都具有几乎相同的签名。唯一不同的是返回类型。返回类型指定为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>的所有注册的方法。

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

yhwx_88 回答:如何使用StructureMap在构造函数中注入实现同一泛型接口的所有类?

我们可以做的是为返回类型引入另一个接口,所有将要返回的类型都将实现它。

定义一个接口:

$ ./cppcheck --enable=style --addon=misra --inline-suppr misra_suprpession_test.c
Checking misra_suppression_test.c ...

作为示例,将返回一种类型:

public interface IData
{
}

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

它的DataFetcher实现如下所示:

public class FooData : IData
{
}

现在我们可以做的是定义Handler类,例如:

public class FooDataFetcher : IDataFetcher<FooData>
{
     public FooData FetchData(MyObject data)
     {
       // logic here and return instance of FooData
     }
}
本文链接:https://www.f2er.com/2376048.html

大家都在问