#asp.net-mvc-3 #dependency-injection #unity-container
#asp.net-mvc-3 #внедрение зависимостей #единство-контейнер
Вопрос:
В настоящее время я вставляю зависимость в свой контроллер mvc, как показано ниже:
public class HomeController : Controller
{
[Dependency]
public IProxyService ProxyService { get; set; }
}
В global.asax тип регистрируется с помощью
UnityContainer _container = new UnityContainer();
_container.RegisterType<IProxyService, SystemProxyServiceEx>();
Теперь мне нужно передать несколько параметров конструктору SystemProxyServiceEx. К ним относятся некоторые значения, хранящиеся в переменной сеанса (HttpSessionStateBase Session), которые сохраняются во время аутентификации. Как мне это сделать?
Комментарии:
1. Почему вы не используете внедрение конструктора в своем
HomeController
? Таким образом, вы можете удалить зависимость от контейнера Unity из своего приложения.
Ответ №1:
Обычная вещь, которую нужно сделать, это обернуть их в класс и внедрить его на основе интерфейса. Например:
// This interface lives in a service or base project.
public interface IUserContext
{
string UserId { get; }
// Other properties
}
// This class lives in your Web App project
public class AspNetUserContext : IUserContext
{
public string UserId
{
get { return (int)HttpContext.Current.Session["Id"]; }
}
// Other properties
}
Теперь вы можете заставить свой SystemProxyServiceEx
принимать зависимость от IUserContext
. Последний шаг — зарегистрировать его, что, конечно, будет несложно:
_container.RegisterType<IUserContext, AspNetUserContext>();
Комментарии:
1. Спасибо! я пробовал это, но все еще есть проблема. Некоторые переменные сеанса, такие как loggedinuser и т.д., Фактически инициализируются в контроллере моей учетной записи, который выполняет аутентификацию. _container. Вызываемый RegisterType в настоящее время находится в событии Application_Start() global.asax, поэтому проблема, с которой я сталкиваюсь, когда unity пытается разрешить зависимость в самом начале, в классе AspNetUserContext, HttpContext.Current. На данный момент сеанс равен нулю. Есть ли какой-либо способ, которым я могу выполнить задержку загрузки здесь, чтобы этот вызов был выполнен после завершения аутентификации.
2. @user748526: Unity не будет вызывать свойства
AspNetUserContext
класса, поэтому, пока вы не используете свойства, когда пользователь не аутентифицирован, проблем возникнуть не должно. Вы могли бы даже добавитьIsUserAuthenticated
свойство.3. Ага! Теперь я понял! Большое спасибо @Steven 🙂