Чтобы использовать инъекцию зависимостей в .NET Core, мы создали связку интерфейсов репозитория для наших контроллеров, используемых для взаимодействия с базами данных.Интерфейсы и наследование с помощью дженериков в C#
У нас есть класс EntityBase
, в котором есть некоторые методы, а наш общий интерфейс репозитория использует этот базовый класс: IRepository<T> where T : EntityBase
.
Я хочу добавить более конкретный класс TaggedEntityBase
, который расширяет EntityBase
, чтобы представить тот факт, что у нас есть некоторые объекты, которые мы хотим фильтровать по тегам. Я хочу, чтобы TaggedEntityBase
имел абстрактное свойство, которое я могу использовать в своем контроллере, чтобы я мог абстрагироваться и повторно использовать метод фильтрации.
Так что я хочу что-то вроде этого, но я думаю, что я хочу ITaggedRepository
также наследовать от IRepository
так, чтобы класс, реализующий ITaggedRepository
гарантированно иметь метод ListAll
и ListWithTags
метод:
public class EntityBase { }
public abstract class TaggedEntityBase : EntityBase
{
public string TagIDs { get; }
}
public interface IRepository<T> where T : EntityBase
{
IEnumerable<T> ListAll();
}
public interface ITaggedRepository<T> where T : TaggedEntityBase
{
IEnumerable<T> ListWithTags(System.Linq.Expressions.Expression<Func<T, bool>> predicate);
}
I «Я уверен, что я просто полностью смутил себя, преследуя эту линию мышления, но я не уверен, как делать то, что я действительно хочу здесь. Я знаю, что мне нужно сохранять абстракцию для инъекций зависимостей, но я чувствую, что я нахожусь на грани того, что возможно с интерфейсами.
Есть ли лучшая линия мышления, которая заставит меня туда, куда я пытаюсь идти?
Не 'ITaggedRepository: IRepository ' делать то, что вы хотите , или я что-то упустил в вашем вопросе? –
CodeCaster
Я хочу ограничить 'ITaggedRepository', чтобы потребовать' TaggedEntityBase' –
Вы можете, becasuse 'TaggedEntityBase: EntityBase'. – CodeCaster