Я пытаюсь реализовать аналогичный сценарий CompositeValidator
в Простом инжекторе Документы .
Вот составной класс:
public class CompositePriceCalculator<T> : IPriceCalculator<T>
{
private readonly IEnumerable<IPriceCalculator<T>> _priceCalculators;
public CompositePriceCalculator(IEnumerable<IPriceCalculator<T>> priceCalculators)
{
this._priceCalculators = priceCalculators;
}
public double CalculatePrice(T item)
{
var totalPrice = _priceCalculators.Sum(priceCalc => priceCalc.CalculatePrice(item));
return totalPrice;
}
}
Некоторыереализация IPriceCalculator
:
public class Class1 : IPriceCalculator<SomeModel>
{
public double CalculatePrice(SomeModel item) => ...
}
Регистрация:
container.Collection.Register(typeof(IPriceCalculator<>), new [] { typeof(Class1) });
container.Register(typeof(IPriceCalculator<>), typeof(CompositePriceCalculator<>),
Lifestyle.Scoped);
По какой-то причине при вводе метода CalculatePrice
в CompositePriceCalculator
class - _priceCalculators
коллекция пуста (Count= 0).
Может кто-нибудь помочь, почему Class1
не вводит в IEnumerable<IPriceCalculator<T>>
коллекцию?
ОБНОВЛЕНИЕ
Предположим, SomeModel
наследоватьс BaseModel
public class SomeModel : BaseModel
{
}
Class1
реализует IPriceCalculator<BaseModel>
НО * SomeModel
для его реализации.
public class Class1 : IPriceCalculator<BaseModel>
{
public double CalculatePrice(BaseModel item)
{
var someModel = item as SomeModel;
// Uses someModel
}
}
Любой класс, который хочет CalculatePrice
, реализует IPriceCalculator
с BaseModel
, чтобы CompositePriceCalculator
повторил все эти IPriceCalculator<BaseModel>
экземпляры.
public class Class2 : IPriceCalculator<BaseModel>
{
public double CalculatePrice(BaseModel item)
{
var someModel2 = item as SomeModel2;
// Uses someModel2
}
}
Есть ли способ спроектировать код таким образом, чтобы избежать приведения к SomeModel
в Class1
, но при этом получить итерацию на всех IPriceCalculators?