Autofac - разрешение менее конкретных ковариантных реализаций - PullRequest
0 голосов
/ 20 февраля 2019

Я использую Autofac.Допустим, у меня есть ковариантный интерфейс

interface IOptionFactory<out T> where T : IOption

и конкретные реализации

class Option1Factory : IOptionFactory<Option1>
class Option2Factory : IOptionFactory<Option2>

Я регистрирую их как

container.RegisterType<Option1Factory>.As<IOptionFactory<Option1>>();
container.RegisterType<Option2Factory>.As<IOptionFactory<Option2>>();

Есть ли способ, как решить всереализации IOptionFactory?Поскольку это ковариантно, это должно быть допустимо в C # (я прав?).Что-то вроде:

var factories = container.Resolve<IEnumerable<IOptionFactory<IOption>>>();

1 Ответ

0 голосов
/ 21 февраля 2019

Лучшее решение - обернуть ваш код в класс Reporting с частным IEnumerable свойством IOptionFactory<IOption>.

private class Reporting
{
    private IEnumerable<IOptionFactory<IOption>> _allOptionsFactories;

    public Reporting(IEnumerable<IOptionFactory<IOption>> allOptionsFactories)
    {
        if (allOptionsFactories == null)
        {
            throw new ArgumentNullException("Parameter:" + nameof(allOptionsFactories));
        }
        this._allOptionsFactories = allOptionsFactories;
    }

    public void Report()
    {
        foreach (var optionsFactories in _allOptionsFactories)
        {
            Console.WriteLine(optionsFactories.GetType());
        }
    }
}

И тогда вы можете зарегистрировать и использовать их с:

[TestMethod]
public void PassingParametersToRegister_NamedParameter()
{
    ContainerBuilder builder = new ContainerBuilder();

    builder.RegisterType<IOption1Factory1<SomeOption>>().As<IOptionFactory<IOption>>();
    builder.RegisterType<IOption1Factory2<SomeOption>>().As<IOptionFactory<IOption>>();
    builder.RegisterType<Reporting>();

    using (var container = builder.Build())
    {
        container.Resolve<Reporting>().Report();
    }

    //OUTPUT:

    //Enumerations + IOption1Factory1`1[Enumerations + SomeOption]
    //Enumerations + IOption1Factory2`1[Enumerations + SomeOption]
}

Вот весь код в моем github

...