Доступ к Ninject Kernel.Get () из HttpHandler с существующей пользовательской базой - PullRequest
2 голосов
/ 02 апреля 2011

У меня есть веб-приложение ASP.Net, которое использует Ninject 2.2.0.0

У меня есть HTTPHandler, который наследуется от класса Microsoft.Web.ImageHandler.

В нем мне нужно получить доступ к экземпляру класса обслуживания, который я создал.

потому что я не могу наследовать от Ninject.Web.HttpHandlerBase, я подумал, что просто выставлю ядро ​​как свойство класса Global.asax ...

protected override IKernel CreateKernel()
    {
        IKernel kernel = new StandardKernel(new DefaultModule());

        var sms = kernel.Get<SiteMapService>();
        SiteMapSvc = sms;
        Kernel = kernel;
        return kernel;

    }

    public IKernel Kernel
    {
        get; set;
    }

и используйте метод kernel.Get для получения службы ..

var global = (Global) HttpContext.Current.ApplicationInstance;

var service = global.Kernel.Get<PhotoService>();

Это терпит неудачу со следующим ...

   [ArgumentNullException: Cannot be null
Parameter name: root]
   Ninject.ResolutionExtensions.GetResolutionIterator(IResolutionRoot root, Type service, Func`2 constraint, IEnumerable`1 parameters, Boolean isOptional, Boolean isUnique) in c:\Projects\Ninject\ninject\src\Ninject\Syntax\ResolutionExtensions.cs:258
   Ninject.ResolutionExtensions.Get(IResolutionRoot root, Type service, IParameter[] parameters) in c:\Projects\Ninject\ninject\src\Ninject\Syntax\ResolutionExtensions.cs:151
   Thumb.GenerateImage(NameValueCollection parameters) in \Thumb.ashx.cs:40

UPDATE: Мне удалось это исправить, изменив для этого свойство Global.Kernel, но теперь я попадаю на территорию против паттернов ...

public IKernel Kernel
    {
        get { return this.CreateKernel(); }
    }

Теперь прочитаем и посмотрим, что это значит ..

1 Ответ

6 голосов
/ 02 апреля 2011

Используется анти-шаблон Service-Locator .Это будет работать, но вы теряете гибкость IoC и везде добавляете зависимость, которую сложно протестировать.

Этот простой ответ заключается в том, что вы можете добавить "KernelContainer.Inject (this)" в ваш HttpHandler.Или вы можете создать пользовательский модуль (или изменить существующий модуль Ninject.Web) для выполнения внедрения перед выполнением обработчика.

...