Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用StructureMap在构造函数中注入实现相同泛型接口的所有类?_C#_Design Patterns_Dependency Injection_Structuremap - Fatal编程技术网

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

C# 如何使用StructureMap在构造函数中注入实现相同泛型接口的所有类?,c#,design-patterns,dependency-injection,structuremap,C#,Design Patterns,Dependency Injection,Structuremap,我有一堆数据获取程序,它们都有几乎相同的签名。唯一不同的是返回类型。返回类型指定为T: 我有这个界面: public interface IDataFetcher<T> { T FetchData(MyObject data); } 公共接口IDataFetcher { T获取数据(MyObject数据); } 接下来,我将介绍这个接口的大约10个实现。在调用代码中,我想执行以下操作: public class FetchCommandHandler { priv

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

我有这个界面:

public interface IDataFetcher<T>
{
    T FetchData(MyObject data);
}
公共接口IDataFetcher
{
T获取数据(MyObject数据);
}
接下来,我将介绍这个接口的大约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
        }
    }
}
公共类FetchCommandHandler
{
私有只读IEnumerable\u获取程序;
public FetchCommandHandler(IEnumerable fetchers)//这当然不起作用
{
_取数器=取数器;
}
公共MyResult句柄()
{
var myObj=new MyObject();//从数据库获取对象
foreach(变量取数器在_取数器中)
{
var result=fetcher.FetchData(myObj);
//做一些有结果的事情
}
}
}
因此,最后,我想要的是不必在构造函数中注入每个
DataFetcher
实现。我正在寻找从StructureMap检索
IDataFetcher
的所有注册的方法


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

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

定义一个接口:

public interface IData
{
}

public interface IDataFetcher<T> where T : IData
{
    T FetchData(MyObject data);
}
它的DataFetcher实现如下所示:

public class FooDataFetcher : IDataFetcher<FooData>
{
     public FooData FetchData(MyObject data)
     {
       // logic here and return instance of FooData
     }
}
公共类FooDataFetcher:IDataFetcher
{
公共数据获取数据(MyObject数据)
{
//这里是逻辑,返回FooData实例
}
}
现在我们可以定义处理程序类,如下所示:

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
        }
    }
}
公共类FetchCommandHandler
{
私有只读IEnumerable\u获取程序;
public FetchCommandHandler(IEnumerable fetchers)//这当然不起作用
{
_取数器=取数器;
}
公共MyResult句柄()
{
var myObj=new MyObject();//从数据库获取对象
foreach(变量取数器在_取数器中)
{
var result=fetcher.FetchData(myObj);
//做一些有结果的事情
}
}
}

由于回执器的返回类型不同,您需要显示(并解释)如何处理回执器的结果。您的foreach循环现在假定类型相同,并且假定您能够以相同的方式处理所有结果,但是它们不同的返回类型意味着您对它们有不同的处理。谢谢!我理解这个想法,但我不能让它在SM中发挥作用。我这样做是为了注册抓取程序:
scan.Assembly(“包含程序集的程序的名称”);扫描。连接实现到类型关闭(类型化(IDataFetcher))不确定SM的语法,但这应该有助于注册。经过几个小时的尝试,我终于找到了答案。我没有在
IDataFetcher
中指定
out
关键字,因此必须是
IDataFetcher
。这很有意义,因为我们在这里处理的是一个接口,而不是一个具体类型。@Martijn终于为您工作了,您是否在解决方案中使用了
IData
?是的,否则我无法将
IEnumerable
注入我的构造函数:)
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
        }
    }
}