Используя интерфейсы ключевой фактор в создании Вашего кода, легко тестируемого в дополнение к удалению ненужных связей между Вашими классами. Путем создания интерфейса, который определяет операции на классе, Вы позволяете классы, которые хотят использовать ту функциональность способность использовать его без в зависимости от Вашего класса с реализацией непосредственно. Если позже Вы решаете изменить и использовать различную реализацию, Вы должны только изменить часть кода, где реализация инстанцируют. Остальная часть кода не должна изменяться, потому что это зависит от интерфейса, не класса с реализацией.
Это очень полезно в создании модульных тестов. В классе под тестом у Вас есть он, зависят от интерфейса и вводят экземпляр интерфейса в класс (или фабрика, которая позволяет ему создавать экземпляры интерфейса по мере необходимости) через конструктора или метод set свойства. Класс использует обеспеченный (или созданный) интерфейс в его методах. Когда Вы идете для записи тестов, можно дразнить или фальсифицировать интерфейс и обеспечить интерфейс, который отвечает данными, настроенными в модульном тесте. Можно сделать это, потому что класс под тестом имеет дело только с интерфейсом, не конкретной реализацией. Любой класс, реализовывая интерфейс, включая Ваш ложный или поддельный класс, сделает.
РЕДАКТИРОВАНИЕ: Ниже ссылка на статью, где Erich Gamma обсуждает свою кавычку, "Программа к интерфейсу, не реализация".
Взгляните на:
Эта ветка форума MSBuild, которую я начал
Вы найдете мое временное решение / обходной путь там!
(MyBaseProject нуждается в некотором коде, который ссылается на некоторые классы (что угодно) из elmah.dll для elmah.dll, копируемого в корзину MyWebProject1!)
Если вы не используете сборку непосредственно в коде, тогда Visual Studio, пытаясь быть полезным, обнаруживает, что он не используется, и не включает его в вывод. Я не уверен, почему вы наблюдаете разное поведение между Visual Studio и MSBuild. Вы можете попробовать настроить вывод сборки на диагностику для обоих и сравнить результаты, чтобы увидеть, где они расходятся.
Что касается вашей ссылки на elmah.dll, если вы не ссылаетесь на нее непосредственно в коде, вы можете добавить ее как элемент в свой проект и установите Действие сборки на Контент
, а для Копировать в выходной каталог - Всегда
.