Как я могу внедрить все экземпляры как коллекцию IEnumarable <T>, которые реализуют общий интерфейс в Prism? - PullRequest
1 голос
/ 01 апреля 2020

Я хочу внедрить все экземпляры как IEnumarable, которые реализуют общий интерфейс. Он предназначен для использования в распознавателе шаблонов стратегий. Как мне это сделать? Я гуглил, что у контейнера Юнит есть способ.

Мне нужно это сделать, чтобы выполнить ту же работу, что и ссылка ниже.

https://ufukhaciogullari.com/blog/strategy-pattern-with-dependency-injection/

    public interface ITest
    {
        string Name { get; set; }
    }

    public class TestA : ITest
    {
        public string Name { get; set; } = "A";
    }

    public class TestB : ITest
    {
        public string Name { get; set; } = "B";
    }

    public class TestC : ITest
    {
        public string Name { get; set; } = "C";
    }

    public class SomeResolver
    {
        IEnumerable<ITest> _tests;
        public SomeResolver(IEnumerable<ITest> tests)
        {
            _tests = tests;
        }
    }

В единстве я могу зарегистрироваться следующим образом:

container.RegisterType<IEnumerable<IParserBuilder>, IParserBuilder[]>();

Я пытался сделать то же самое в Prism, но это не удалось. Как это сделать в Призме?

1 Ответ

0 голосов
/ 01 апреля 2020

Я пытался сделать то же самое в Prism, но это не удалось. Как это сделать в Prism?

Контейнер для инъекций Prism не зависит от вас, он просто пытается скрыть от вас IUnityContainer.

При этом нет необходимости регистрировать IEnumerable<IParserBuilder> в первую очередь.

container.Resolve<SomeResolver>()

вызовет конструктор и передаст ему экземпляры TestA, TestB и TestC, если вы зарегистрировали их в первую очередь.

container.Register<ITest, TestA>( "A" );
container.Register<ITest, TestB>( "B" );
container.Register<ITest, TestC>( "C" );

К сожалению, эти A, B и C также не могут быть введены, так что вам нужно сохранить свойство Name, если вам нужно определить конкретную c услугу (я бы сделать это только для чтения, хотя). Я хотел бы иметь возможность ввести IEnumerable<(string, ITest)> и получить имена тоже ...

...