我有一个ASP。. NET Web Forms项目,用VB编写。.NET运行在。NET 4.5.2
我已经成功地将Ninject插入到我的应用程序中,但是我遇到了一个障碍。
我在我的网页中使用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类有一些共享/静态方法-这会导致问题吗(我可以在必要时更改这个)。
仅供参考——上面的代码应该被视为伪代码——我是临时输入的,而不是复制粘贴的——所以它可能包含语法错误。
终于算出来了
所以,我不能让MyWrapper类使用Ninject。我的假设是,因为这是一个web表单应用程序(而不是MVC),管道是不同的,MyWrapper类不是通过相同的管道运行,所以Ninject永远不会意识到它。
这是我"修复"我的问题所做的。
我创建了一个新的Base页面
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()
现在可以了
作为完整性检查,我还向IService实现的Constructor和Dispose方法中添加了代码,并将其记录下来,以查看对象何时被创建和处置。
从日志中,我可以看到我的Service对象被正确地创建并处理了每个请求。