Как я могу передать два возможных типа в T в универсальном классе C #? - PullRequest
1 голос
/ 13 мая 2019

Я реализовал Repository Pattern в Asp.Net Core приложении. Я использую универсальный класс для базового хранилища:

public class GenericRepository<T> : IDisposable, IGenericRepository<T>, IGenericRepositoryAsync<T>
    where T : BaseEntity, new()
{
    // Standard methods like: GetById, Update, Delete etc.
}

У меня есть определенные репозитории, следующие за моим Domain: FeedRepository, UserRepository. И Entities: Post, ApplicationUser.

Мой FeedRepository выглядит так:

public class FeedRepository : GenericRepository<Post>, IFeedRepository
{
    // Specific methods for Feed
}

Проблема в том, что мне нужно использовать GenericRepository для всех других моих репозиториев, но моя сущность ApplicationUser расширяется IdentityUser, а не BaseEntity.

Есть ли способ иметь 2 возможных типа для GenericRepository? Может ли T быть иногда BaseEntity, а иногда IdentityUser?

1 Ответ

2 голосов
/ 13 мая 2019

Ну, теоретически, вы могли бы сделать это:

public class GenericRepository<T, TBase> : IDisposable, IGenericRepository<T>, IGenericRepositoryAsync<T>
    where T : TBase, new()
{
    // Standard methods like: GetById, Update, Delete etc.
}

Но мне неясно, что это могло бы сделать. Обычно, когда вы используете общие критерии, это потому, что кто-то в вашем классе знает, как каким-то особым образом взаимодействовать с типом в критериях (BaseEntity).

Если это не так, то, во-первых, для этого критерия нет никакой реальной цели, и вы должны просто удалить его.

Если это * , вы, вероятно, должны создать отдельный тип репозитория. Например, у вас может быть GenericEntityRepository, а затем отдельный IdentityUserRepository или что-то в этом роде.

...