Внедрение экземпляра в StructurMap после начальной загрузки HttpContext Scoped - PullRequest
0 голосов
/ 27 апреля 2010

Я пытаюсь использовать StructureMap в приложении asp.net MVC вместо HttpSession для хранения экземпляров.

Мой простой тестовый класс:

public interface ICurrentSession
{
   User User { get; set; }
}

public class CurrentSession : ICurrentSession
{
   public User User { get; set; }
}

Вот соответствующий код реестра, который вызывается в моем загрузчике:

x.For<ICurrentSession>().HttpContextScoped().Use<CurrentSession>();

А потом, после того как я аутентифицирую пользователя, я называю это:

var session = new CurrentSession {User = user};
ObjectFactory.Inject<ICurrentSession>(session);

Однако каждый раз, когда я вызываю ObjectFactory.GetInstance (), он возвращает один и тот же экземпляр CurrentSession для каждого сеанса (несколько браузеров, в которых зарегистрировано несколько пользователей). Что я делаю не так, или как я могу ввести CurrentSession и определить его область для каждого зарегистрированного пользователя / сеанса?

1 Ответ

2 голосов
/ 27 апреля 2010

Непонятно, почему вы пытаетесь внедрить экземпляр (который переопределит ваш регистрационный код). Вы должны просто получить текущий экземпляр, ограниченный текущим запросом, а затем установить пользователя. Любые дальнейшие запросы для ICurrentSession в этом запросе получат тот же экземпляр.

После аутентификации пользователя позвоните:

ObjectFactory.GetInstance<ICurrentSession>().User = user;

Код регистрации в вашем вопросе охватит экземпляр только текущим HTTP-запросом. Если вы хотите, чтобы экземпляр сохранялся при нескольких запросах и работал в течение всего сеанса ASP.NET, вам необходимо использовать жизненный цикл HttpSession. Для этого жизненного цикла нет удобного метода (и я предупреждаю, что он не подвергается тщательному тестированию, поскольку мы его не используем), но он доступен:

x.For<ICurrentSession>()
  .LifecycleIs(Lifecycles.GetLifecycle(InstanceScope.HttpSession)))
  .Use<CurrentSession>();
...