C# 如何使用StructureMap在构造函数中注入实现相同泛型接口的所有类?
我有一堆数据获取程序,它们都有几乎相同的签名。唯一不同的是返回类型。返回类型指定为T: 我有这个界面: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
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
}
}
}