Невозможно получить доступ к методам базового класса репозитория - PullRequest
2 голосов
/ 06 мая 2011

В моих конкретных классах репозитория, например, CollectionRepository, я наследую базовый базовый класс (BaseRepository) и в конструкторе использую базовый UnitOfWork, который должен быть введен. Однако я не могу получить доступ ни к одному из унаследованных методов BaseRepository.

Полностью из идей, любая помощь будет оценена.

Вот код, иллюстрирующий мою проблему:

Мой контроллер, в который вводится хранилище.

public readonly ICollectionRepository _collectionRepository;

public HomeController(ICollectionRepository collectionRepository, IRepository<Collection> repository)
{
  _collectionRepository = collectionRepository;
}

public ActionResult Index()
{
  _collectionRepository. //Here i only get the ICollectionRepositoryMethods

  return View(new List<Note>());
}

Мой базовый репозиторий:

public class BaseRepository<T> : IRepository<T> where T : IAggregateRoot
{
  public readonly IUnitOfWork _unitOfWork;

  public BaseRepository(IUnitOfWork unitOfWork)
  {
    _unitOfWork = unitOfWork; 
  } 

  public BaseRepository()
  {}

  public void Save(T Entity)
  {
    _unitOfWork.Session.Save(Entity);
  }
}

И вот определенный класс хранилища, который наследует базу.

public class CollectionRepository : BaseRepository<Collection>, ICollectionRepository
{
  public CollectionRepository(IUnitOfWork unitOfWork) : base(unitOfWork)
  {
  }

  public IList<Collection> GetTodaysCollections()
  {
    throw new System.NotImplementedException();
  }
}

Я настраиваю CollectionRepository следующим образом с Structuremap, но не уверен, что это правильно:

For<ICollectionRepository>().Use<CollectionRepository>();

1 Ответ

1 голос
/ 06 мая 2011

Вы можете ввести интерфейс для BaseRepository, который реализует ICollectionRepository.

Это позволит любому, кто имеет дело с ICollectionRepository, знать о методах BaseRepository.

public interface IBaseRepository<T>
{
    void Save(T Entity);
}

и BaseRepository реализует это:

public class BaseRepository<T> : IBaseRepository<T>, IRepository<T> where T : IAggregateRoot

Теперь, когда ICollectionRepository реализует этот интерфейс, все классы, которые в свою очередь реализуют ICollectionRepository, также реализуют IBaseRepository.

public ICollectionRepository<T> : IBaseRepository<T>
{
    //ICollectionRepository methods go here...
}

Поскольку ваш CollectionRepository наследуется от BaseRepository, который реализует интерфейс IBaseRepository, вы уже удовлетворяете требованиям и теперь можете вызывать методы базового класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...