Единство с asp.net mvc, передача параметров с внедрением свойств

#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 🙂