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

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

我有一堆数据获取器,它们都有几乎相同的签名。唯一不同的是返回类型。返回类型被指定为T。

我有这个接口

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

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

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> 在构造函数中实现。我正在寻找一种方法来恢复所有的 IDataFetcher<T> 从StructureMap。

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

c# design-patterns dependency-injection structuremap
1个回答
1
投票

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

定义一个接口 。

public interface IData
{
}

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

作为一个例子,一个将被返回的类型。

public class FooData : IData
{
}

它的DataFetcher实现将是这样的。

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

现在我们可以做的是定义一个类似于Handler类的东西:

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
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.