Как создать или использовать готовые Shims для .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;
За ним следует класс aa (позвольте назвать 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: этот пакет предоставляет инфраструктурные услуги и не должен ссылаться непосредственно из вашего кода....
Обновление: подчеркивая, что конечной целью является .net core 2.0
Upd2: вся задача состоит в том, чтобы перенести основную часть приложения WPF в .net core
(оставив рабочее приложение WPF) для потенциального веб-клиента. Основная часть содержит элементы .net framework
которые не реализованы для .net core
.
Upd3: пара слов о полной стратегии: более полная стратегия - это совлокальные проекты, первый подход в этой статье (#if). В моей стратегии есть два основных шага: один - постепенный перенос кода, начиная с базовых библиотек и заканчивая верхними библиотеками, но с интенсивным использованием заглушек и PlatformNotSupportedException
. Вторым шагом является переход от лучших библиотек к базовым библиотекам, заменяющим заглушки и исключения с помощью реализаций ядра.net, по запросу (!) - нет необходимости подставлять все заглушки и исключения.
Upd4 Мы уже разделили переносные тесты из непереносимых тестов (в две библиотеки). Очень важно, чтобы мы запускали тесты во время процесса переноса.