Я слежу за предыдущим вопросом . Ответ, который я принял, включает использование универсального IRepository
для обработки базового CRUD, обернутого специфичным для домена IMovieRepository
, который делегирует универсальной установке. Дальнейшие подробности включают использование метода WrapQueryInSession
для универсального IRepository
:
IEnumerable<T> WrapQueryInSession(Func<ISession, IEnumerable<T>> query);
Я приступил к реализации, когда понял, что это предоставляет NHibernate ISession
потребителям универсального репозитория. В противном случае NHibernate полностью содержится в реализации IRepository
, но для сигнатуры этого метода.
Это выходит на первый план, когда я хочу провести модульный тест MovieRepository
, имея IRepository
, реализованный в RepositoryFake
, переданный конструктору MovieRepository
:
protected override void BeforeEachTest()
{
_fixture = new MovieRepository(new RepositoryFake());
}
Мой тестовый класс имеет частную реализацию поддельного репозитория:
private class RepositoryFake : IRepository<Movie>
{
...
public IEnumerable<Movie> WrapQueryInSession(Func<ISession, IEnumerable<Movie>> query)
{
...
}
...
}
Способ настройки, тестовый класс и любой другой потребитель реализации IRepository
узнают о ISession
из NHibernate и, следовательно, о самом NHibernate. Это похоже на утечку абстракции.
Есть ли лучший способ полностью ограничить использование NHibernate в реализации IRepository
?