3

В настоящее время я разрабатываю приложение MVC 3 с EF и шаблоном репозитория. Я создал общий интерфейс следующим образом:Использование общего интерфейса в шаблоне репозитория

interface IGenericRepository<T> 
{ 
} 

И абстрактный класс следующим образом:

abstract class GenericRepository<TContext ,T> : IGenericRepository<T> 
    where TContext : DbContext, new() 
{ 
} 

После того, что мой репо наследует оба так:

interface ICardRepository : IGenericRepository<Card> 
{ 
} 

и

class CardRepository : GenericRepository<EfContext, Card>, 
    ICardRepository 
{ 
} 

С регистрацией Unity I тер интерфейс и класс, как это:

container.RegisterType<ICardRepository, CardRepository>(); 

Теперь вопрос: могу ли я использовать IGenericRepository вместо ICardRepository? Как это:

container.RegisterType<IGenericRepository<Card>, CardRepository>(); 

В теории я могу, но я до сих пор не понимаю, как эта схема работает, я не совсем уверен, если я не ломать или что-то отсутствует.

ответ

1

Один из возможных вопросов - теперь вам нужно будет решить IGenericRepository<Card>, а не ICardRepository.

Это не будет работать:

var cardRepository = container.Resolve<ICardRepository>(); 

Вместо этого вы должны будете сделать это:

var cardRepository = container.Resolve<IGenericRepository<Card>>(); 

Это также означает, что если вы делаете что-то вроде инъекции конструктора, вы не можете использовать:

public class SomethingDependentOnCardRepository 
{ 
    // The parameter type should be IGenericRepository<Card> instead, 
    // if you are using Unity to resolve this dependency. 
    public SomethingDependentOnCardRepository(ICardRepository cardRepository) 
    { 
     // code 
    } 
} 
+0

Спасибо за ответ. На самом деле я это знаю. Дело в том, что если я использую интерфейс, я каким-то образом нарушу шаблон? Например (я знаю, что это не так), я могу сделать тестирование сложнее, если я использую общий интерфейс. – Unknown

+0

Ах. Я не могу думать о каких-либо потенциальных проблемах с этим. Моя единственная проблема заключается в том, какой целью будет служить интерфейс ICardRepository? Или это будет устранено в процессе? –

+0

Я хочу избавиться от этого интерфейса и вместо этого использовать только общий интерфейс - это избавит меня от создания многочисленных копий одного и того же интерфейса с другим именем, таким как ICardRepository, ITagRepository, ISomethingElseRepository, которые в основном одинаковы. – Unknown

Смежные вопросы