Поддельные сборки показывают предупреждения при создании прокладок для интерфейса и заглушек для закрытых типов
У меня есть сборка, сконфигурированная с постом CI, в котором выполняются некоторые тесты. Несмотря на успешное выполнение тестов, сборка отображает предупреждения:
: Невозможно создать заглушку для StructuremapMvc: тип запечатан.: Невозможно сгенерировать прокладку для IUnitOfWork: тип является интерфейсом.: Невозможно создать shim для Repository.IRepository`1: тип является интерфейсом.
и так далее.
Я использую общий шаблон хранилища вместе с Unit Of Work. Я добавил поддельные сборки для моего проекта MVC WebApi (который использует внедрение зависимостей с использованием StructureMap) и проекта данных, который содержит мои репозитории и UnitOfWork. Я исследовал эту ошибку и, кажется, несколько убежден, что это может быть связано с ограничениями поддельных сборок, но я должен быть абсолютно уверен, что я не делаю ничего плохого
2 ответа
Способ, которым я избавился от этих предупреждений, заключался в создании только необходимых прокладок. Я добавил следующее в файл конфигурации подделок.
<ShimGeneration>
<Clear/>
<Add FullName="ATypeToShim!"/>
<Add FullName="AnotherTypeToShim!"/>
</ShimGeneration>
! в конце фильтра это делает точное совпадение с учетом регистра.
Для заглушек я только заглушаю интерфейсы, так что это легко:
<StubGeneration>
<Clear />
<Add Interfaces ="true"/>
</StubGeneration>
Здесь есть больше деталей: http://msdn.microsoft.com/en-us/library/hh708916.aspx
На самом деле это не ограничение подделок, но на самом деле это не ошибка. То, что вам нужно знать, это то, что окурки и прокладки.
Заглушки просты: это класс, который реализует или расширяет некоторый класс, переопределяя каждый метод свойством делегата и флагом, определяющим, должен ли он вызывать базовый класс впоследствии (примечание: этот флаг предназначен для всей заглушки, а не для метода), Вы используете их для внедрения зависимостей, так как они позволяют вам размещать всю логику в лямбдах в коде, а не где-то в сгенерированном классе. Поскольку они расширяют неинтерфейсы, запечатанные классы не могут быть заглушены.
Прокладки являются более сложными, потому что они применяются к любому экземпляру указанного типа. Не уверен, как именно это делается, но для вас важно то, что, поскольку у интерфейса не может быть экземпляра, у него не может быть прокладки. Это нормально, так как именно здесь вы должны использовать заглушку. Они опасны, потому что с помощью прокладки вы переопределяете результат функции в пределах всего контекста shims, и это почти исключительно, когда что-то ломается, к которому у вас нет доступа - что-то, что было бы лучше внедрить.
Так что я не буду беспокоиться о предупреждениях. Они на самом деле не о чем-то важном, просто чтобы убедиться, что вы знаете, что происходит.