Различные файлы XAP в Silverlight - общий доступ к контексту

У меня есть приложение silverlight, которое я недавно разделил на отдельные файлы xap.

Намерение таково. Существует xap-файл 1, который принимает несколько входных данных от пользователя и сохраняет его в базе данных. И когда пользователь нажимает кнопку в этом пользовательском интерфейсе (из файла xap 1), он загружает файл xap 2, который запрашивает дополнительные входные данные и сохраняет его в базе данных.

Мне удалось вызвать xap-файл 2 из xap-файла 1, но пользовательский интерфейс, похоже, не может получить информацию из базы данных (пользовательский интерфейс показывает, что было сохранено предыдущим пользовательским интерфейсом), и он не может сохранить ввод пользователя. Я понимаю, что xap-файл 2 каким-то образом должен как-то указывать, где и как сохраняться.

Вот как я загружаю файл xap 2

        WebClient wc = new WebClient();
        wc.OpenReadCompleted += new OpenReadCompletedEventHandler(OpenReadCompleted);
        Uri uri = new Uri("xapfile2.xap", UriKind.Relative);
        wc.OpenReadAsync(uri);


 private void OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
    {
        Uri uri = new Uri("xapfile2.dll", UriKind.Relative);

        StreamResourceInfo resource_stream = App.GetResourceStream(new StreamResourceInfo(e.Result, null), uri);

        AssemblyPart part = new AssemblyPart();
        Assembly assembly = part.Load(resource_stream.Stream);
        UIElement control = assembly.CreateInstance("xapfile2.Window") as UIElement;
        if (control != null)
        {
            RadWindow window = (RadWindow)control;
            window.ShowDialog();

        }
    }

(Весь этот пользовательский интерфейс работал до того, как я разделил их на отдельные xap. У нас были веские причины для их разделения)

Любая помощь будет принята с благодарностью

ОБНОВЛЕНИЕ

Я пробовал следовать примеру ссылке и смог запустить второй пользовательский интерфейс из отдельного xap-файла со всей информацией из базы данных.

Теперь, кажется, я столкнулся с новой проблемой. Когда я выполняю отмену во втором пользовательском интерфейсе, нужно ли мне выгружать второй xap, вызывающий removeXap, из каталога? Когда я это делаю, я получаю ошибку "Композиция остается неизменной".

1) Изменению в экспорте препятствует неразборный импорт 'xapfile2.Views.ViewModel (ContractName = "MyViewModel")' в части 'xapfile2.Views.MyView'. Любые идеи?.

Спасибо K


person Karthik Balasubramanian    schedule 05.01.2012    source источник
comment
Думали ли вы об использовании Prism для загрузки файловых модулей xap за вас? Это может помочь.   -  person Nick Nieslanik    schedule 05.01.2012
comment
новая проблема должна быть новым вопросом. У других людей могла быть такая же проблема или возникла такая же проблема, и они захотели ее найти.   -  person foson    schedule 09.01.2012


Ответы (3)


Вы должны использовать фреймворк, чтобы добавить свой XAP-файл. Вы изобретаете велосипед.

Я предлагаю использовать MEF, фреймворк, созданный Microsoft, чтобы делать именно то, что вы создаете.

MEF имеет концепцию каталога развертывания, который скачивает и загружает файлы xap. Затем, используя шаблоны, такие как интерфейсы и контракты, вы можете создавать объекты, отображать их на экране и вводить дополнительные данные.

См. Этот пример: http://codebetter.com/glennblock/2010/03/08/building-hello-mef-part-iv-deploymentcatalog/

Удачи!

person Jeremiah    schedule 06.01.2012
comment
Я пробовал следовать примеру по ссылке и смог запустить второй пользовательский интерфейс из отдельного xap-файла со всей информацией из базы данных. Теперь, кажется, я столкнулся с новой проблемой. Когда я выполняю отмену во втором пользовательском интерфейсе, нужно ли мне выгружать второй xap, вызывающий removeXap, из каталога? - person Karthik Balasubramanian; 09.01.2012
comment
Привет, Иеремия, Спасибо за ответ. - person Morteza Azizi; 05.12.2012

Наличие отдельных файлов XAP не создает никаких ограничений - когда загружается второй XAP, его типы загружаются в один и тот же домен приложений. Похоже, вам нужна какая-то общая шина обмена сообщениями между классами в ваших Xap1 и Xap2. Вы можете использовать агрегатор событий. У многих фреймворков есть один, или вы можете использовать свой собственный - Создайте его (и пользовательские типы событий) в dll, на которую ссылаются оба файла xap. Думаю, я использовал http://www.keith-woods.com/Blog/post/Rx-Event-Aggregator.aspx.

person foson    schedule 06.01.2012

После долгой борьбы я обнаружил, что у меня есть избыточные сборки в файлах xap. Видимо конфликта в сборках быть не должно. Установка CopyLocal = False на сборках, необходимых для второго xap, похоже, решила проблему.

Спасибо, ребята, за советы

K

person Karthik Balasubramanian    schedule 11.01.2012