2016-10-07 6 views
1

У меня есть проект ASP.NET Web Forms, написанный на VB.NET, работающий на .NET 4.5.2ASP.NET Web Forms + Ninject + Helper Class с iService - как сделать дескриптор Ninject iService?

Я успешно подключил Ninject к моему приложению, но я ударил его.

Я использую Injection Ninject собственности в моих веб-страницах (образец ниже)

Partial Class MyPage 
    Inherits Page 

<Inject> 
Public Property _myService As IService 

Все звонки в эту работу ... так что это хорошо

_myService.DoWork() 

Однако в моем приложении у нас есть класс, который мы используем для обертывания звонков в наш сервис (см. ниже)

Public Class MyWrapper 

    <Inject> 
    Public Property _myService As IService 

    Public Sub DoWork() 
     _myService.DoWork() 
    End Sub 

End Class 

Этот класс используется на веб-страницах ...

Dim wrapper As New MyWrapper() 

wrapper.DoWork() 

Это не работает - в классе MyWrapper, Ninject не вводя IService.

Я предполагаю, что, поскольку мой класс не является веб-страницей, он не находится в стадии разработки и поэтому Ninject ничего не делает с ним.

Я прочитал некоторые другие сообщения, которые предполагают внесение изменений в MyWrapper для наследования из Ninject.Web.PageBase, но, попробовав это, он не работает.

У кого-нибудь есть предложения?

MyWrapper имеет более 100 ссылок в нашем приложении, поэтому в идеале я не хочу менять каждую строку кода.

Кроме того, класс MyWrapper имеет некоторые методы Shared/Static - это вызовет проблему (я могу изменить это, если необходимо).

FYI - приведенный выше код должен обрабатываться псевдокодом - я набрал его adhoc, а не копирование - и поэтому он может содержать синтаксические ошибки.

ответ

0

Наконец-то это удалось.

Итак, я не мог заставить класс MyWrapper использовать Ninject. Мое предположение заключается в том, что, поскольку это приложение для веб-форм (а не MVC), конвейер отличается от другого, а класс MyWrapper не выполняется по тому же конвейеру, и поэтому Ninject никогда не знает об этом.

Вот что я сделал, чтобы «исправить» мою проблему.

Я создал новую базовую страницу

Public Class MyBasePage 
    Inherits System.Web.UI.Page 

    <Inject> 
    Public Property wrapper As MyWrapper 
End Class 

я изменил мою страницу .aspx.vb (MyPage) наследовать выше ...

Partial Class MyPage 
    Inherits MyBasePage 

ранее я забыл упомянуть, что Я добавил MyWrapper в файл NinjectWebCommon.vb ...

Private Shared Sub RegisterServices(kernel As IKernel) 
    'The MappingModule is my external code where I Bind my interfaces to the concrete classes 
    'So for the purpose of this example, the MappingModule resolves IService 
    Dim mappingModule = New MappingModule() 
    kernel.Load(mappingModule, loggingModule) 

    'Because MyWrapper is a class within my web application (rather than an 
    'external assembly which is handled in the above MappingModule) I have 
    'to explicitly tell Ninject how to resolve it. 
    kernel.Bind(Of MyWrapper).ToSelf().InRequestScope 
End Sub 

Я редактировал MyWrapper класс, чтобы включить новую переменную-член и конструктор

private ReadOnly _service As IService 

Public Sub New(service As IService) 
    _service = service 
End Sub 

Так, с выше на месте, теперь я могу использовать следующий код из моей веб-странице (MyPage.aspx. vb)

wrapper.DoWork() 

Теперь это работает.

Как проверка работоспособности, я также добавил код методам Constructor и Dispose для моей реализации IService и зарегистрировал это, чтобы увидеть, когда объект был создан и удален.

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

 Смежные вопросы

  • Нет связанных вопросов^_^