如何使用 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
}
}
}
我有一堆数据提取器,它们都具有几乎相同的签名。唯一不同的是 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
}
}
}