Как создать или использовать готовые Шиммы для .net framework 4.6.1
элементов для их портирования (от .net framework 4.6.1
) до .net core 2.0
/ .net standard 2.0
?
Некоторые классы интереса: , было бы неплохо иметь прокладки для таких классов, как:
System.Windows.Threading.Dispatcher
или
System.ComponentModel.ItemPropertyInfo.Descriptor
даже
System.Windows.Controls.MenuItem
и многие другие ...
Контекст:
Приложение (код) не на 100% хорошо организован.Бизнес-логика не отделена на 100% от логики пользовательского интерфейса.Ответ «сначала сделай рефакторинг», безусловно, хороший ответ.Но в моем случае все не на 100% так, как должно быть в идеале.
Примерный пример, попробуйте сделать это вручную:
System.Windows.Threading.Dispatcher
не реализовано в Core 2.0
.
Можно попытаться добавить:
public enum DispatcherShimPriority
{
Background
//...
}
public interface DispaicherShim
{
void Invoke(Action action, DispatcherShimPriority prio);
void BeginInvoke(Action action, DispatcherShimPriority, prio);
}
С последующими двумя реализациями этого интерфейса:
public class DispatcherCore: DispaicherShim;
и
public class DispatcherFramework: DispaicherShim;
За ним следует класс (давайте назовем его Shims
) в многоцелевом проекте:
public static DispaicherShim CreateDispatcher()
{
#if NETCOREAPP2_0
return new DispatcherCore();
#else
return new DispatcherFramework();
#endif
}
В результате получается шим, который можно использовать в различных API.
Это правильный подход?
На самом деле, создание таких прокладок требует много рутинной работы.У меня такое ощущение, что эту работу не нужно выполнять.У меня такое ощущение, что есть готовое решение этой проблемы ...
Мне известно о пакете Microsoft.Windows.Compatibility
.Вопрос скорее связан с портированием, когда WPF
связан со многими элементами, специфичными для wpf.Эти элементы не находятся в пакете Microsoft.Windows.Compatibility
, но, к сожалению, они используются во всех моих сборках, которые являются кандидатами для перенаправления на .Net Core 2.0
.Я имею ввиду шимминг тех классов, которых нет в Microsoft.Windows.Compatibility
.
Хорошо, у нас есть это Microsoft.Windows.Compatibility.Shims
, но я не уверен, что это полезно в моем случае;особенно после прочтения следующего текста :
Microsoft.Windows.Compatibility.Shims : этот пакет предоставляет услуги инфраструктуры и на него нельзя ссылаться непосредственно из вашегокод ....
Upd: подчеркивая, что конечная цель - .net core 2.0
Upd2: всезадача состоит в том, чтобы перенести основную часть приложения WPF на .net core
(оставив работающее приложение WPF ) для потенциального веб-клиента .Основная часть содержит .net framework
элементов, которые не реализованы для .net core
.
Upd3: Пару слов о полной стратегии: Более полная стратегия - это общие проекты, сначала Подход в этой статье (#if) .В моей стратегии есть два основных шага: один - постепенно портировать код, начиная с базовых библиотек и заканчивая топовыми библиотеками, но с интенсивным использованием заглушек и PlatformNotSupportedException
s.Вторым шагом является переход от верхних библиотек к базовым библиотекам, заменяющим заглушки и исключения реализациями ядра .net, по требованию (!) - нет необходимости заменять все заглушки и исключения.
Upd4 Мы уже разделили переносимые тесты из непереносимых тестов (на две библиотеки).Очень важно, чтобы мы запускали тесты во время процесса портирования.