Как обеспечить возможность, например, OnActivate (в Autofa c) в Mvx.IoCProvider.Register - PullRequest
1 голос
/ 05 февраля 2020

Autofa c предоставляет метод OnActivated(), который позволяет выполнять любое действие после создания зарегистрированного типа.

Возможно использовать аналогичный метод в MvvmCross ? Есть ли у вас какие-либо идеи по обеспечению такой же функциональности?

1 Ответ

0 голосов
/ 07 февраля 2020

Обычно полезно понимать основы внедрения зависимостей (DI) вместо того, чтобы полагаться на определенные функции контейнера DI. Задайте себе вопрос: Если бы у меня не было DI-контейнера, то как бы я решил мою проблему?

По иронии судьбы, получается, что с все намного проще. Чистый DI .

Если у вас не было DI-контейнера, то как бы вы выполняли действие после создания объекта?

Самое простое решение - предоставить фабрику, которая создает и инициализирует объект. Принимая во внимание тот же API и требования, что и в документации Autofa c, подразумевается , вы можете сделать это:

public static Dependency2 CreateDependency2(ITestOutputHelper output, Dependency1 dependency)
{
    var d2 = new Dependency2(ITestOutputHelper output, Dependency1 dependency);
    d2.Initialize();
    return d2;
}

Если вам все еще нужно использовать другой DI-контейнер, большинство из них позволяют вам зарегистрировать фабрику, как указано выше, против типа. Я не знаю, как работает MvvmCross, но я бы удивился, если бы это было невозможно. Если это не так, вы можете реализовать Adapter поверх вашей фактической зависимости. Адаптер позаботится о запуске действия над адаптированным объектом.

FWIW: если объект не находится в допустимом состоянии, прежде чем выполнить какое-либо действие с ним, инкапсуляция нарушается. Фундаментальная характеристика c инкапсуляции состоит в том, что объекты защищают свои инварианты, так что они никогда не могут находиться в недопустимых состояниях. Если возможно, рассмотрите лучший дизайн API.

...