В нашем C# MVC-приложении у нас есть много интерфейсов, которые отображают 1 к 1 с объектами, которые их реализуют. т.е.: в основном для каждого созданного объекта была выполнена операция «интерфейс экстракта».Принцип повторной абстракции в C#
Интерфейсы используются Moq для генерации макетных объектов для наших модульных тестов. Но это единственный раз, когда интерфейсы повторно используются.
В нашей системе нет конкретных объектов, реализующих несколько интерфейсов.
Может ли кто-нибудь сказать мне, если это вызовет проблемы в будущем? И если да, то каковы они будут?
Я думал, в нашем приложении много дублирования, например, в этих двух интерфейсах (Edit: на нашем уровне сервиса) единственное, что отличается, это имя метода и тип параметра, который они принимают, но семантически они делают то же самое с хранилищами они посылают сообщения:
interface ICustomer
{
void AddCustomer(Customer toAdd);
void UpdateCustomer(Customer toUpdate);
Customer GetById(int customerId);
}
interface IEmployee
{
void AddEmployee(Employee toBeAdded);
void UpdateEmployee(Employee toUpdate);
Employee GetById(int employeeId);
}
и где я думаю, что повторно принцип абстракции будет входить, т.е. преобразовать код что-то вроде:
public interface IEmployee: IAdd<Employee>, IUpdate<Employee>, IFinder<Employee>
Речь идет не о патче репозитория tern - это о интерфейсах в любом слое, которые выглядят так, как будто они разделяют семантически идентичные поведения. Стоит ли вызывать общие интерфейсы для этих операций и наследовать от них «под-интерфейсы»?
По крайней мере, это обеспечило бы согласованность подходов методов. Но какие другие преимущества мне это дадут? (Принцип замещения Лискова в сторону)
В настоящее время имена методов и типов возврата повсюду.
Я прочитал блог Марка Сееманна о повторных абстракциях Принцип, но я не понимал этого, чтобы быть откровенным. Может быть, я просто глуп :) Я также прочитал определение Фаулера «Интерфейсы заголовков».
Похоже, вам нужен общий репозиторий. –
Мне придется искать повторно используемые абстракции, но ваше предложение выглядит как Принцип разделения сегрегации, который является частью кода SOLID. Это не может быть плохо :) – jrahhali
Эти методы, которые я упомянул, на самом деле являются частью уровня сервиса (бизнеса). Мы не используем DDD. В нашей реализации контроллеры MVC используют «службы» (объекты, названные в соответствии с строками EmployeeServices, CustomerServices), которые реализуют интерфейсы, подобные приведенным выше. Они «используют» репозитории на другом уровне, реализованные в Entity Framework, которые имеют довольно похожие интерфейсы. – Scott