Разрешение типа без регистрации сначала - Prism 4 и Untiy - PullRequest
0 голосов
/ 10 октября 2010

Прежде всего, я хотел бы отметить, что я новичок в концепции призмы, DI и контейнеров.Я смотрю на один из примеров кода, предоставляемых библиотекой Prism: код просто внедряет представление со строкой «Hello World» (в элементе TextBlock) в область оболочки.

Когда приложениепри запуске он создает новый экземпляр BootStrapper, который создает и инициализирует оболочку:

public class Bootstrapper : UnityBootstrapper
{
    protected override DependencyObject CreateShell()
    {
        return Container.Resolve<Shell>();
    }

    protected override void InitializeShell()
    {
        base.InitializeShell();

        Application.Current.RootVisual = (UIElement)this.Shell;
    }

    protected override void ConfigureModuleCatalog()
    {
        base.ConfigureModuleCatalog();

        ModuleCatalog moduleCatalog = (ModuleCatalog)this.ModuleCatalog;
        moduleCatalog.AddModule(typeof(HelloWorldModule.HelloWorldModule));
    }
}

Мой вопрос касается метода CreateShell ().Я не мог найти нигде в предоставленном коде (включая не в файле конфигурации или любом файле xaml ...), где они регистрируют тип Shell, и даже если он был зарегистрирован - класс Shell поставок не реализует какой-либо интерфейс ... чтосмысл разрешения определенного типа?реализация Shell:

public partial class Shell : UserControl
{
    public Shell()
    {
        InitializeComponent();

    }
}

Для меня это выглядит волшебством, поэтому я попытался создать свой собственный тип (MyType) и разрешить его таким же образом:

Container.Resolve<MyType>();

Установивточка разрушения внутри конструктора MyType, я увидел, что он разрешил MyType.Может кто-нибудь, пожалуйста, объясните мне, как это работает?

Ответы [ 2 ]

1 голос
/ 10 октября 2010

Эти две темы должны ответить на ваш вопрос:

Кроме того, если вы хотите узнать больше о том, как Unity может это сделать, просто загрузите Unity 2.0 и откройте исходный код, который поставляется вместе с установщиком.

Надеюсь, это поможет.

Спасибо, Дамиан

0 голосов
/ 22 июля 2014

Вам не нужно регистрировать тип, который вы хотите разрешить. Вам необходимо зарегистрировать зависимости типа, который вы хотите разрешить. В этом случае оболочке не нужны никакие зависимости, так что вы можете решить ее просто. Но для примера (не совсем), если ваша оболочка получает интерфейс IService в качестве параметра, то вы должны зарегистрировать IService, прежде чем разрешить Shell.

В противном случае вы получите исключение при разрешении зависимости. В Prism 4.1 он будет проглочен молча благодаря TryResolve.

...