Виндзорский замок IoC - Http сессия - PullRequest
1 голос
/ 17 марта 2011

Я использую MVC 3, у меня есть ряд контроллеров, зависящих от различных репозиториев, 1 из моего репозитория зависит от сеанса http context.Я создал интерфейсы для каждого из своих репозиториев, чтобы использовать IoC Windsor-Castle.

Как передать текущий объект сеанса в репозиторий, который в нем нуждается?

, который я использовал длябыть в состоянии сделать это, и «Resolve» позаботится о том, чтобы передать сеанс в нужное хранилище, так или иначе я не могу сделать это в последней версии (2.5.3 фев 2011):

Protected Overrides Function GetControllerInstance(ByVal requestContext As System.Web.Routing.RequestContext, _
                                                   ByVal controllerType As System.Type) As System.Web.Mvc.IController
    Dim match As IController
    ' 1 or more components may need the session,
    ' adding it as a (possible) dependency
    Dim deps As New Hashtable
    deps.Add("session", HttpContext.Current.Session)
    match = container.Resolve(controllerType, deps)
    Return match
End Function

СпасибоВинсент

Ответы [ 2 ]

4 голосов
/ 18 марта 2011

Присмотритесь к своему дизайну.Когда вы смотрите на это функционально, ваш репозиторий на самом деле не зависит от сессии, но от некоторых данных, которые вы храните в сессии.Создайте абстракцию над вещами, которые вы хотите извлечь из сеанса, и дайте хранилищу зависеть от такой абстракции.Например:

public interface IUserProvider
{
    int GetCurrentUserId();
}

public class SomeRepository : ISomeRepository
{
    private readonly IUserProvider userProvider;

    public SomeRepository(IUserProvider userProvider)
    {
        this.userProvider = userProvider;
    }
}

Теперь вы можете создать следующую реализацию этой абстракции:

private class HttpSessionUserProvider : IUserProvider
{
    public int GetCurrentUserId()
    {
        return (int)HttpContext.Current.Session["UserId"];
    }
}

Вы можете зарегистрировать этот конкретный тип в конфигурации IoC.

Thisгораздо лучше, потому что вы не хотите, чтобы ваш репозиторий зависел напрямую от HTTP-сессии.Это усложняет тестирование и создает зависимость между вашим хранилищем и конкретной технологией представления.

2 голосов
/ 17 марта 2011

Единственная ответственность фабрики контроллеров - создавать контроллеры. Не обрабатывать сеансы или любые другие зависимости. Лучше всего просто зарегистрировать сеанс в качестве отдельного компонента и позволить Windsor автоматически подключить его. Удалите оттуда хеш-таблицу deps и зарегистрируйте:

  container.Register(Component.For<HttpSessionStateBase>()
      .LifeStyle.PerWebRequest
      .UsingFactoryMethod(() => new HttpSessionStateWrapper(HttpContext.Current.Session)));

Затем введите HttpSessionStateBase в свой контроллер.

Кстати: контроллеры уже имеют доступ к сеансу, в этом нет необходимости, если вы просто вводите сеанс в контроллеры.

...