Я НЕНАВИЖУ, когда нахожу интерфейсы и реализации в одном и том же пространстве имен / сборке. Пожалуйста, не делайте этого, если проект развивается, это проблема в рефакторинге.
Когда я ссылаюсь на интерфейс, я хочу реализовать его, чтобы не получить все его реализации.
Что может быть допустимо, так это поместить интерфейс с его классом зависимостей ( класс, который ссылается на интерфейс ).
РЕДАКТИРОВАТЬ: @ Джош, я просто прочитал мое последнее предложение, это сбивает с толку! конечно, и класс зависимости, и класс, который его реализует, ссылаются на интерфейс. Для ясности приведу примеры:
Приемлемо:
Интерфейс + реализация:
namespace A;
Interface IMyInterface
{
void MyMethod();
}
namespace A;
Interface MyDependentClass
{
private IMyInterface inject;
public MyDependentClass(IMyInterface inject)
{
this.inject = inject;
}
public void DoJob()
{
//Bla bla
inject.MyMethod();
}
}
Реализующий класс:
namespace B;
Interface MyImplementing : IMyInterface
{
public void MyMethod()
{
Console.WriteLine("hello world");
}
}
НЕ ПРИНИМАЕТСЯ:
namespace A;
Interface IMyInterface
{
void MyMethod();
}
namespace A;
Interface MyImplementing : IMyInterface
{
public void MyMethod()
{
Console.WriteLine("hello world");
}
}
И, пожалуйста, НЕ СОЗДАЙТЕ проект / мусор для ваших интерфейсов! пример: ShittyProject.Interfaces. Вы упустили суть!
Представьте, что вы создали DLL, зарезервированную для ваших интерфейсов (200 МБ). Если вам нужно было добавить один интерфейс с двумя строками кода, ваши пользователи должны будут обновить 200 МБ только для двух тупых подписчиков!