Как Вы изучаете WPF и Silverlight?

Похоже, что фактическая проблема состоит в том, как выбрать реализацию сервиса на основе некоторых критериев. Исключение выдается, потому что GetServices возвращает все сервисов , произведенных регистрациями, включая сам фабричный метод. Когда фабрика вызывает GetServices, она в конечном итоге вызывает себя рекурсивно, пока не возникнет исключение StackOverflowException.

Другая проблема заключается в том, что GetServices() фактически создаст экземпляры службы, но будет использовать только один. Другой отбрасывается. Это приводит к появлению мусорных объектов и может быть дорогостоящим, если сама служба дорогая или управляет ресурсом, таким как соединение с базой данных.

Рекурсии можно избежать, если службы регистрируются напрямую, и фабричный метод вызывает GetService с нужным типом, как только он решает, какой из них требуется: [

services
    .AddTransient()
    .AddTransient();

// register the factory last
services.AddTransient(provider =>
{
    var type=PickFooType();

    return provider.GetService(type);
};

. Трюк теперь выбирает правильный тип. Это зависит от фактического критерия. Одно дело выбрать тип на основе, например, некоторой конфигурации или легкодоступного состояния, это совсем другое - выбрать его на основе свойств класса реализации.

В «простом» случае давайте предположим, что нужно выбрать правильный тип, основываясь на флаге или настройке конфигурации. Выбор типа может быть простым switch.

Если эта настройка доступна при запуске, можно избежать заводских настроек и просто зарегистрировать нужный тип.

В некоторых случаях настройка может измениться во время выполнения. Например, в случае сбоя одного удаленного поставщика услуг нам может потребоваться переключиться на другого. В простейшем случае можно использовать простой переключатель:

Type PickPaymentProvider()
{
    var activeProvider=LoadActiveProvider();
    switch (activeProvider)
    {
        case 'Paypal':
            return typeof(Foo1);
        case 'Visa' :
            return typeof(Foo2);
        ...
    }
}        

Обновление - разрешение зависимостей на основе контекста

Из обновления вопроса кажется, что проблема не не как создать фабрику. Это как выбрать сервис на основе контекста каждого отдельного запроса (значения параметров, переменные среды, данные и т. Д.). Это называется контекстным разрешением зависимостей. Он доступен в усовершенствованных контейнерах DI, таких как Autofac , но не в реализации и абстракциях DI .NET Core.

Правильный способ его добавления потребует добавления промежуточного программного обеспечения, которое заменяет шаг разрешения DI перед каждым запросом. Быстрый и грязный способ - добавить саму фабричную функцию в качестве службы и вызывать ее при необходимости. Это то, что Рахул показывает в своем ответе.

Это означает, что AddTransient придется зарегистрировать функцию , которая принимает параметры, необходимые для разрешения:

services.AddTransient(provider =>
{
    IFoo resolver(MyParam1 param1,MyParam2 param2)
    {
        var type=PickFooType(param1,param2);    
        return provider.GetService(type);
    }

    return resolver;
};

Это регистрирует Func. Контроллер может запросить эту функцию либо через конструктор, либо через внедрение действия :

public IActionResult MyAction([FromServices] resolver,int id,MyParam1 param1...)
{
    MyParam2 param2=LoadFromDatabase(id);
    IFoo service=resolver(param1,param2);
    var result=service.DoSomeJob();
    return OK(result);
}

. Регистрируя фабрику вместо интерфейса IFoo, мы можем зарегистрировать услуги по интерфейсу снова.

services
    .AddTransient()
    .AddTransient();

Если нам нужно позвонить в каждую зарегистрированную службу и спросить ее, может ли она обслуживать наш запрос, мы можем снова использовать GetServices:

services.AddTransient(provider =>
{
    IFoo resolver(MyParam1 param1,MyParam2 param2)
    {
        var firstMatch=provider.GetServices()
                               .First(svc=>svc.CanFoo(param1,param2));
        return firstMatch;
    }

    return resolver;
};

5
задан Craig Shearer 30 December 2008 в 19:31
поделиться

6 ответов

У Bill Steele, от Microsoft, есть многослойный ряд вебкаста, который берет Вас с абсолютного начала WPF. Я думаю, что существует что-то как 15 эпизодов. Необходимо смочь найти его в событиях Microsoft путем поиска Супа WPF На Гайки.

4
ответ дан 13 December 2019 в 05:43
поделиться

Я купил Pro WPF в 2008 C# и нашел это очень полезным для WPF, но нашел, что он сразу разбивающий имел дело с различиями в привязке, VSM, и т.д. между WPF и Silverlight

Вы имели успех с видео на сайте http://silverlight.net/Learn/? Делает у любого есть комментарии к Pro Silverlight 2 Apress в 2008 C#

4
ответ дан 13 December 2019 в 05:43
поделиться

Я проложил себе путь через "Pro Silverlight 2", и я нашел каждую главу очень подробной и полной. Я также упомянул SAMS "Silverlight 2, Развязанный", та книга является хорошим дополнением к "Pro Silverlight 2". Кроме того, взгляните на "Совет дня Silverlight" и блог Jesse Liberty для некоторых удобных подсказок.

HTH, инди

0
ответ дан 13 December 2019 в 05:43
поделиться

Пойдите сюда для материала WPF. Пойдите сюда для Silverlight.

Оба - надежные источники.

2
ответ дан 13 December 2019 в 05:43
поделиться

Проверьте веб-сайт для своей местной библиотеки.

Я живу в Бостоне, Массачусетс. Проложенный под землей глубоко на их веб-сайте бесплатная подписка на Книги Safari Онлайн, которая имеет тысячи технологии и бизнес-книг от ведущих издателей включая O'Reilly и т.д.

Проложенный под землей на другой странице веб-форма, которую можно заполнить, чтобы сделать, чтобы они отправили Вам число читательского билета по электронной почте. Число читательского билета получает Вас доступ к техническим книгам.

На другой странице существуют также бесплатные аудиокниги. Не для технологии, но после программирования существует жизнь!

Adam Leffert

1
ответ дан 13 December 2019 в 05:43
поделиться

Я думаю, что Смешение Выражения является важным инструментом, когда начинающийся с Silverlight, поскольку запись xaml не идет легко в начале, и необходимо сконцентрироваться больше на xaml ошибках, чем в полной системе вещей и фактических визуальных результатов.

Позже каждый определенно закончит тем, что настроил (хорошо убирающий) крупный код, который Смешение создает и оттуда к записи XAML вручную, поскольку разработчикам нравится жить в VS, и запускающий Смешение дополнительное перемещение.

Это было началом, и я надеюсь, что после нескольких месяцев Вы проходите это. Хотя по сей день (8 месяцев в) у меня все еще есть некоторый материал, я чувствую себя более комфортно, делая в Смешении.

Оттуда на я переместился в документацию MSDN - хотя intellisense дает нам всем возможные свойства и их значения, документация может дать нам ответы, каково это на самом деле. Для меня это был своего рода шаг для прибытия в сначала открыться, например, документация DockPanel в MSDN, чтобы не начать предполагать то, что делает параметр x.

Это напоминает мне о другой проблеме, что я имел с Silverlight - когда я был абсолютно плохо знаком с технологиями Microsoft затем сначала, я испытал реальные затруднения при навигации по документации MSDN. Кажется глупым теперь, но я ничего не мог найти оттуда. Таким образом, важная часть изучения новых технологий должна изучить структуру документации :).

1
ответ дан 13 December 2019 в 05:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: