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-контейнера.