Я понимаю, что пустые интерфейсы могут быть запахом кода. Я использую его и не могу найти, в чем заключается недостаток дизайна.
У меня есть абстрактный класс DBServer, который называется Server
public abstract class Server
{
protected ICustomerRepository CustomerRepository;
public string HostName{ get; }
protected Server(string HostName)
{
this.HostName = HostName;
}
protected GetCustomers()
{
return CustomerRepository.GetCustomers();
}
}
Поскольку я использую два механизма БД, скажем, A и B, у меня есть две реализации.
Реализация для A требует ICustomerRepository
для A, скажем ACustomerRepository
.
Однако для возможности модульного тестирования реализации для A я буду использовать интерфейс IACustomerRepository
и вводить зависимость.
Проблема в том, что этот интерфейс пуст.
public interface ICustomerRepository
{
string HostName { get; set; }
IEnumerable<ICustomer> GetCustomers();
}
public interface IACustomerRepository:ICustomerRepository
{
}
Этот интерфейс реализует логику для извлечения данных из БД для механизма A:
class ACustomerRepository : IACustomerRepositoryRepository
{
public IEnumerable<ICustomer> GetCustomers()
{
//Data retrieval logic...
}
}
Эта реализация внедряется в реализацию Server
для A с использованием Unity:
public class ServerA: Server
{
public ServerA (
string HostName,
IACustomerRepository ACustomerRepository):
base(HostName)
{
CustomerRepository = ACustomerRepository;
ACustomerRepository.HostName = HostName;
}
}
Конфигурация Unity:
container.RegisterType<IACustomerRepository, ACustomerRepository>();
Я читал о «маркерных интерфейсах», но я не совсем уверен, что это применимо здесь.
Не могли бы вы помочь мне определить основную проблему, чтобы я мог исправить этот запах кода?