我有两个类生成实现的类型序列IFoo
。
interface IBar {} // the starting type
interface IFoo {} // this can undergo various transformations
class SeqProcessor1 {
IEnumerable<IFoo> Process(IEnumerable<IBar> input1) {
//...
}
}
和
class SeqProcessor2 {
IEnumerable<IFoo> Process(IEnumerable<IFoo> input2) {
//...
}
}
SeqProcessor2
将一个转换IEnumerable<IFoo>
为另一个IEnumerable<IFoo>
,所以在代码中你会看到:
var seqProc1 = new SeqProcessor1();
var seqOfFoo = seqProc1.Process(seqOfBar);
var seqProc2 = new SeqProcessor2();
var finalSeqOfFoo = seqProc2.Process(seqOfFoo);
由于应用程序中没有其他使用模式,使用构造函数注入来明确两种类型之间的关系是否是正确的设计选择?
下面是一个简化测试头接口的示例(请参阅此处),摘自SeqProcessor1
:
interface ISeqProcessor1 {
IEnumerable<IFoo> Process(IEnumerable<IBar> input1);
}
class SeqProcessor2 {
ISeqProcessor1 proc1;
SeqProcessor2(ISeqProcessor1 proc1) {
this.proc1 = proc1;
}
IEnumerable<IFoo> Process(IEnumerable<IBar> seqOfBar) {
var input = this.proc1.Process(seqOfBar);
//
return input;
}
}
查看如何SeqProcessor2::Process
更改为接受IEnumerable<IBar>
所需的依赖项。
导致这种用法:
var seqProc2 = new SeqProcessor2(new SeqProcessor1());
var finalSeqOfFoo = seqProc2.Process(seqOfBar);
编辑:
这里的关键是第一个处理器(需要的那个
IBar
)IBar
将实例转换为IFoo
实例。即使两者
SeqProcessorX
具有相似的签名SeqProcessor1
,也不能在没有强制更改的情况下自然链接。SeqProcessor2
可以改为链接具有相同签名
SeqProcessor2
(IFoo
-> ) 的其他处理器。IFoo