Ответ 1
Как создается экземпляр репозитория, а также его время жизни, это не касается контроллера.
Когда вы регистрируете компоненты в контейнере, вы должны указать время жизни компонента. В зависимости от вашей реализации вы можете просто выбрать, чтобы жизненный цикл репозитория выполнялся после сеанса.
В любом случае вы можете использовать factory для создания репозитория из сеанса, но делать это извне контроллера.
Вам определенно нужно избавиться от конструктора по умолчанию.
Сверху моей головы я не могу вспомнить, как это сделать в Unity или StructureMap, поэтому здесь приведен пример Castle Windsor.
Определить абстрактный Factory:
public interface IRepositoryFactory
{
Repository Create();
}
и реализация
public class MyRepositoryFactory : IRepositoryFactory
{
private readonly HttpContextBase httpContext;
public MyRepositoryFactory(HttpContextBase httpContext)
{
if (httpContext == null)
{
throw new ArgumentNullException("httpContext");
}
this.httpContext = httpContext;
}
#region IRepositoryFactory Members
public Repository Create()
{
// return Repository created from this.httpContext
}
#endregion
}
Теперь зарегистрируйте все материалы
container.AddFacility<FactorySupportFacility>();
container.Register(Component.For<IRepositoryFactory>()
.ImplementedBy<MyRepositoryFactory>()
.LifeStyle.PerWebRequest);
container.Register(Component.For<Repository>()
.UsingFactory((IRepositoryFactory f) => f.Create())
.LifeStyle.PerWebRequest);
Здесь я использовал стиль PerWebRequest, но если вы хотите оптимизировать, вы можете создать собственный стиль PerWebSession. Это не так сложно сделать в замке, но я не могу вспомнить, как сильно это происходит в других контейнерах DI.
Вам также нужно будет зарегистрировать HttpContextBase, поскольку MyRepositoryFactory зависит от него.