Абсолютно. У вас должен быть какой-то интерфейс, который использует ваш сервисный уровень, тогда вы можете изменить реализацию в любое время, если он реализует тот же интерфейс, он должен быть взаимозаменяемым.
Это преимущество интерфейсов и DI, особенно при использовании контейнера, такого как Spring. Как только вы измените реализацию, просто сконфигурируйте spring для использования новой и все готово.
Обновление, потому что комментарии слишком малы:
Ну, я думаю, все зависит от вашего обслуживания. Дело в том, что если вы используете интерфейс (скажем, поверх NServiceBus), вы всегда можете создать адаптер для подключения реализации WCF к интерфейсу.
Например:
public interface IService {
void DoSomething();
}
public class NServiceBusService : IService {
public void DoSomething() {
//Some NServiceBusCode
}
}
Теперь (я полагаю, я не очень знаком с spring.net), вы можете заставить Spring использовать NServiceBusService в качестве реализации IService.
А теперь вы решили вместо него подключить WCF? Вы могли бы просто иметь реализацию WCF:
public class WCFService : IService {
public void DoSomething() {
//Some WCF Code
}
}
И теперь вы можете настроить Spring на использование WCFService для IService вместо NServiceBusService.
Или, если ваш WCFService не совпадает с подписью для IService, как, возможно, это выглядит так:
public class WCFService {
public void DoSomethingWCFStyle() {
//Some WCF Code
}
}
Тогда вы можете просто использовать шаблон адаптера, чтобы заставить это работать:
public class WCFServiceAdapter : IService {
private WCFService wcfService;
public WCFServicAdapter(WCFService wcfService) {
this.wcfService = wcfService;
}
public void DoSomething() {
wcfService.DoSomethingWCFStyle();
}
}
Независимо от того, что есть способы для вас, чтобы ввести эту зависимость. Сложность в том, что вам нужно настроить контракт с использованием вашего интерфейса, и ваши объекты должны соблюдать этот контракт, иначе у вас будут проблемы. Но всегда есть способ отобразить (например, используя приведенный выше шаблон адаптера) объекты, чтобы они выглядели так, как будто они реализуют интерфейс и заставляют его работать.