Как обрабатывать инъекционные зависимости с помощью mvc, зависит от версии, но всегда помогает использовать реальный контейнер Dependency Injection (DI). Как бы вы ни разрезали его, это решение потребует от вас внедрения ISession в репозиторий, а не ISessionFactory. Это позволяет вашему DI-контейнеру правильно управлять временем жизни сеанса.
Предполагая, что вы используете Asp.Net MVC 3 и у вас нет подключения к конкретному контейнеру DI, запустите консоль Nuget и введите:
install-package Ninject.MVC3
Это пойдет, загрузите Ninject (который является DI-контейнером) и настройте приложение mvc для его использования. Он также создаст файл ~ / App_Start / NinjectMVC3.cs, в котором вы будете настраивать свои зависимости как таковые.
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<ISessionFactory>()
.ToMethod(c => new Configuration().Configure().BuildSessionFactory())
.InSingletonScope();
kernel.Bind<ISession>()
.ToMethod((ctx) => ctx.Kernel.Get<ISessionFactory>().OpenSession())
.InRequestScope();
kernel.Bind<IRepository<>>().To<Repository<>>();
}
Первое утверждение сообщает ninject, что когда что-то требует ISessionFactory, оно должно лениво инициализировать NHibernate и создавать его. Эта фабрика сессий должна сохраняться как единое целое для всего приложения в течение всего срока службы приложения.
Второе утверждение сообщает ninject, что когда что-то требует ISession, оно должно получить экземпляр ISessionFactory и вызвать OpenSession (). Этот сеанс затем повторно используется в рамках запроса и уничтожается в конце запроса.
Третье утверждение говорит ninject, что когда что-то требует IRepository любого типа, оно должно просто создать новое, используя встроенную логику для разрешения зависимостей.
Отсюда вы можете написать свой код следующим образом, и все должно просто работать.
public class WidgetController : Controller
{
private readonly IRepository<Widget> _repository;
public WidgetController(IRepository<Widget> repository)
{
_repository = repository;
}
}
Что касается репозитория, я хотел бы указать вам на отличную запись в блоге Репозиторий - это новый синглтон