Использование универсального интерфейса в шаблоне хранилища - PullRequest
3 голосов
/ 04 февраля 2012

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

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 я регистрирую интерфейс и класс следующим образом:

container.RegisterType<ICardRepository, CardRepository>();

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

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

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

1 Ответ

1 голос
/ 04 февраля 2012

Одной из возможных проблем является то, что теперь вам придется решить 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
    }
}
...