1

我有两个类生成实现的类型序列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);

编辑:

  • 这里的关键是第一个处理器(需要的那个IBarIBar将实例转换为IFoo实例。

  • 即使两者SeqProcessorX具有相似的签名SeqProcessor1,也不能在没有强制更改的情况下自然链接。SeqProcessor2

  • 可以改为链接具有相同签名SeqProcessor2( IFoo-> ) 的其他处理器。IFoo

4

1 回答 1

1

在阅读了您的编辑后,我会说是的,这对于您的用例来说是一个有效/合理的结构。你看我对这个表述有点小心,因为可能没有足够的信息来全面判断这件事。另一方面,可能无法在这里讨论所有可能性,这就是为什么尽管有疑问,我还是将其添加为答案。

尽管如此,我还是添加了这个(肯定的)答案,因为你说这是唯一的使用模式。因此,我们只需要考虑当前的代码 - 结构使您想要实现的意图非常清晰。从阅读中,我可以直接理解你需要一个特定的处理器——代码简短、简单且没有代码重复

长话短说:是的,我认为这是对构造函数注入的有效使用

于 2013-03-18T08:45:34.393 回答