SimpleInjector внедряет пустую коллекцию при использовании универсального интерфейса - PullRequest
0 голосов
/ 23 декабря 2018

Я пытаюсь реализовать аналогичный сценарий 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?

...