Я пытаюсь настроить NHibernate в приложении ASP.NET MVC, используя подход DDD. Тем не менее, я получаю сообщение об ошибке при попытке ленивой загрузки объекта, связанного с объектом. Вот как я структурировал свое приложение:
Уровень инфраструктуры:
Содержит файлы сопоставления, реализации репозитория и загрузчик NHibernate для настройки и построения фабрики сеансов.
Вот пример репозитория:
public class CustomerRepository : ICustomerRepository
{
public Customer GetCustomerById(int customerId)
{
using (var session = NHibernateBootstrapper.OpenSession())
return session.Get<Customer>(customerId);
}
}
Доменный слой:
Имеет простые классы POCO, репозиторий и сервисные интерфейсы
Прикладной уровень:
Содержит реализации службы.
Вот пример службы:
public class CustomerService : ICustomerService
{
private ICustomerRepository _repository;
public CustomerService(ICustomerRepository repository)
{
_repository = repository;
}
public Customer GetCustomerById(int customerId)
{
return _repository.GetCustomerById(customerId);
}
}
Презентационный слой:
Содержит приложение ASP.NET MVC. И здесь я обнаружил свою проблему.
Используя подход MVC, у меня есть контроллер, который, используя службу CustomerService, получает клиента и отображает клиента в представлении (строго типизированный). У этого клиента есть связанный объект Contact, и когда я пытаюсь получить к нему доступ в своем представлении с помощью Model.Contact, где Model - это мой объект Customer, я получаю LazyInitializationException.
Я знаю, почему я это понимаю. Это связано с тем, что сеанс, используемый для извлечения Customer в CustomerRepository, уже мертв. Моя проблема в том, как я могу это исправить. Я хотел бы, если бы я мог избежать получения связанной сущности Контакта для Клиента в моем хранилище, потому что некоторые представления нуждаются только в данных Клиента, а не в Контактных данных. Если это вообще возможно?
Итак, вопрос: возможно ли подождать запросов к базе данных, пока уровень представления не будет нуждаться в связанном объекте Contact?
Я думаю, что мне нужно что-то вроде того, что описывает эта статья . Я просто не могу понять, как реализовать это на уровне инфраструктуры, или где это должно быть реализовано?
Заранее спасибо. Любая помощь будет высоко ценится!