Microsoft имеет очень хорошую обертку Windows API, включенную в платформу.NET. Это хранится в Microsoft. Win32. UnsafeNativeMethods, Microsoft. Win32. SafeNativeMethods и Microsoft. Win32. NativeMethods. К сожалению, они не доступны, потому что они объявляются как частные. Существует ли способ получить доступ к ним легко?
Свойство позиций
слоя представления основано на свойстве anchorPoint
. По умолчанию (0,5, 0,5), т.е. точка привязки слоя находится в его центре. Если вид (и его слой) имеют нечетное количество пикселов в ширину или в высоту, установка интегрального значения для позиции приведет к тому, что начало координат вида будет неинтегрированным, что приведет к видимой размытости.
Чтобы обойти это, вы можете найти интегральную версию своего положения, заняв нужное центральное положение вида, вычитая половину ширины вида, округляя это значение, затем добавляя половину ширины вида и повторяя для высоты. Можно также установить значение anchorPoint
для слоя представления, равное (0,0), и расположить представление в зависимости от его начала.
Есть вероятность, что это также может быть связано с несоответствием подчиненного. Чтобы диагностировать это, можно использовать инструмент Core Animation в окне Instruments и выбрать параметр Color Misaligned Images. Он должен окрашивать любые виды или слои, не выровненные по пикселям в приложении.
-121--3853803-Существует две основные школы мысли по этому вопросу:
Поместите логику в DataContext
(частичный класс или фактический класс, если кодировать DataContext
вручную). Причина этого в том, что DataContext
уже знает обо всех ваших различных сущностях, поэтому это не создает никакой дополнительной связи и не приводит к раздутию класса.
Недостатком, конечно, является то, что если у вас есть несколько сотен этих методов API (и вы, вероятно, в конечном итоге), то ваш DataContext
быстро начнет превращаться в шар грязи, заполненный каждым случайным API запроса любой программист решит вбросить. Можно попытаться очистить это путем разделения связанных функций на различные экземпляры одного и того же класса DataContext
, но это действительно только косметическое улучшение.
Поместите логику в класс репозитария, т.е. в репозитарий
. Два преимущества этого подхода: а) возможность использовать инъекцию зависимостей в репозитории и IoC рамки, в случае, если вы решите изменить модель данных, и b) тот факт, что вы придерживаетесь принципа единой ответственности - фактически имеет смысл , чтобы метод был там, где он есть.
Основными недостатками размещения этих данных в репозитории являются: (а) Они могут дублировать очень похожую логику, которая уже существует в DataContext
как хранимые процедуры; (б) они имеют способ создавать головные боли, когда речь идет об управлении транзакциями (если вы также используете их для сохранения); и (c) когда вы начинаете иметь много пользовательских запросов, которые возвращают специально настроенные DTO для конкретных операций или отчетов, вы оставляетесь с двумя крошечными выбор создания одного репозитория для каждого DTO,или создание одного главного "служебного" репозитория для всех DTO или какой-либо их свободно связанной группы. Оба в конечном итоге довольно плохой дизайн.
Таковы компромиссы; только вы можете решить, что лучше для ваших целей.
Я хотел бы определенно посоветовать против подхода extension-method, поскольку методы расширения трудно обнаружить (вы не можете просто ввести метод и заставить Intellisense подобрать соответствующую ссылку), и они также просто не нужны, когда у вас есть возможность непосредственно изменить или расширить (через partials) исходный класс.
Я бы также посоветовал не продлевать класс Назначение
; одна из причин, по которой мы используем такие инструменты, как Linq To SQL, заключается в том, что мы можем иметь дело с объектами POCO, которые не должны знать что-либо о том, откуда они взялись. По этой причине я лично очень против связывания классов сущностей с их DataContext
- зависимость должна быть только односторонней.
Большинство определений методов в этих классах (если не все) являются объявлениями extern
с атрибутами Dll Import , которые ссылаются на функции в Windows API через P/Invoke. Неважно, где эти заявления находятся. Можно создать собственный класс с именем UnsafeNativeMethods или SafeNativeMethods и поместить в него объявления, ссылающиеся на те же функции Windows API. Подписи многих функций Windows API для C # можно найти на pinvoke.net .
Причина может заключаться в воздействии на безопасность SuppressUnamanagedCodeSecurityAttribute. Проверьте Move P/Invokes to NativeMethods class
Большая часть функциональности, содержащейся в этих классах, открывается самим фреймворком .Net; перед вызовом API необходимо выполнить поиск (или задать вопрос здесь).
Чтобы ответить на ваш вопрос, нет.
Лучшее, что вы можете сделать, это скопировать их из рефлектора или ссылочного источника.
Для чего я всегда думал, что должна была быть кернел32.interop.dll и т.д. со статическими методами уже DllImport'ed. Но я прибегнул к созданию своих по мере необходимости. За годы работы я обнаружил, что редко пользуюсь более чем горсткой из них, но это такая заноза в заднице, когда мне нужен API, который я еще не импортировал.