internal class ChooseServerStage : ActStageBase
{
public ChooseServerStage(FinderWrapper<RegionFinder<PixelCounterComparer<WhiteLetterColorPixelCriteria>>> finder)
: base(finder)
{
}
}
Дженерик-тип тройной вложенности в конструкторе :) Только что написал подобную конструкцию в своем собственном коде.
На самом деле, в каждом случае дженерик-тип представляет собой одну из зависимостей класса. То есть чаще всего это выглядит так:
public class PixelCounterComparer<T> : IImageComparer where T : IColorPixelCriteria {
public PixelCounterComparer(PixelCounter pixelCounter,
T colorPixelCriteria) {
}
}
Основной плюс подхода, как ни странно, это простота и очевидность (после привыкания к подобной конструкции :)). На примере PixelCounterComparer’a можно представить, как это реализовать по-другому:
public class PixelCounterComparer: IImageComparer {
public PixelCounterComparer(PixelCounter pixelCounter,
IColorPixelCriteria colorPixelCriteria) {
}
}
//тогда для использования в ChooseServerStage придется создать специальный класс вроде:
public class PixelCounterComparerForChooseServerStage: PixelCounterComparer {
public PixelCounterComparerForChooseServerStage(PixelCounter pixelCounter,
WhiteLetterColorPixelCriteria colorPixelCriteria)
: base(pixelCounter, colorPixelCriteria)
{
}
}
//и конструктор ChooseServerStage станет выглядеть так:
public ChooseServerStage(FinderWrapper<RegionFinder<PixelCounterComparerForChooseServerStage>> finder)
: base(finder)
{
}
Можно избавляться от дженериков и дальше, в итоге в зависимостях ChooseServerStage будет один простой класс, но чтобы понять, какими именно подклассами он «настроен» придется долго и муторно ковыряться в глубине наследований.
А так — меньше кода и больше очевидности :)
P.S. и да, FinderWrapper<RegionFinder<PixelCounterComparer<WhiteLetterColorPixelCriteria>>> finder очень легко и просто резолвится из IoC-контейнера.