Используйте сервис в классе MVC с Unity Ioc

У меня есть приложение MVC, использующее Unity Ioc.

Объявить и инициировать сервис:

public static void Initialize()
{
    IUnityContainer container = BuildUnityContainer();
    DependencyResolver.SetResolver(new UnityDependencyResolver(container));
}
private static IUnityContainer BuildUnityContainer()
{
    IUnityContainer container = new UnityContainer();
    container.RegisterType<ImyService, myService>(new HttpContextLifetimeManager<ImyService>());;
    return container;
}

В классе я использую код ниже:

var service = DependencyResolver.Current.GetService<ImyService>();

Это файл UnityControllerFactory.cs.

public override object GetValue()
{
    var assemblyQualifiedName = typeof(T).AssemblyQualifiedName;
    if (assemblyQualifiedName != null)
        return HttpContext.Current.Items[assemblyQualifiedName];
    return null;
}

Когда я запускаю приложение, оно возвращает ошибку по адресу: HttpContext.Current.Items[assemblyQualifiedName];

Ошибка:

Дополнительная информация: Ссылка на объект не указывает на экземпляр объекта.

Как я могу использовать сервис в своем классе. Спасибо!


person M.Peter    schedule 17.08.2016    source источник
comment
Произойдет ли то же самое, если вы внедрите службу в конструктор класса?   -  person JB06    schedule 17.08.2016
comment
@ JB06, когда я использую контроллер, он работает, а не ошибка. Используйте только в классе, это приведет к ошибке выше   -  person M.Peter    schedule 17.08.2016


Ответы (1)


проблема здесь в том, что HTTPContext имеет значение null при использовании из класса (или библиотеки классов), как вы пытаетесь сделать. Это потому, что нет запроса для работы. Когда вы используете его из контроллера, все работает, потому что контроллер попадает как часть запроса, так что вы там золотой.

Вы можете обновить свой класс UnityController Factory и вместо этого передать необходимые данные HTTPContext в качестве параметра, а затем использовать их, когда вам нужно. Хотя это немного усложняет ситуацию.

Обратите внимание, что вам, скорее всего, не нужно передавать весь объект HTTPContext, просто передайте минимум, с которым вы можете справиться.

person Andrei Dragotoniu    schedule 17.08.2016
comment
Спасибо @Andrei Dragotoniu. Извините, но я не понимаю ваш преобразователь, вы можете предоставить мне пример кода. - person M.Peter; 17.08.2016