ASP.. NET Web Forms + Ninject +带有iService的Helper类-如何让Ninject



我有一个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对象被正确地创建并处理了每个请求。

相关内容

  • 没有找到相关文章

最新更新