ASP.NET Web Forms + Ninject + Helper Class with iService - 如何让 Ninject 处理 iService?

ASP.NET Web Forms + Ninject + Helper Class with iService - how to make Ninject handle iService?

我在 .NET 4.5.2

上有一个用 VB.NET 运行 编写的 ASP.NET Web 窗体项目

我已成功将 Ninject 插入到我的应用程序中,但是我遇到了障碍。

我正在我的网页中使用 Ninject 属性 注入(示例如下)

Partial Class MyPage
    Inherits Page

<Inject>
Public Property _myService As IService

对这项工作的所有调用...所以这没问题

_myService.DoWork()

但是,在我的应用程序中,我们有一个 class 用于将调用包装到我们的服务中(见下文)

Public Class MyWrapper

    <Inject>
    Public Property _myService As IService

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

End Class

这个class被网页使用...

Dim wrapper As New MyWrapper()

wrapper.DoWork()

这不起作用 - 在 MyWrapper class 中,Ninject 没有注入 IService。

我猜因为我的 class 不是网页,所以它不在管道中,所以 Ninject 没有用它做任何事情。

我读过其他一些建议修改 MyWrapper 以继承自 Ninject.Web.PageBase 的帖子,但尝试过后它似乎不起作用。

有人有什么建议吗?

MyWrapper 在我们的应用程序中有 100 多个引用,所以理想情况下我不想更改每一行代码。

此外,MyWrapper class 有一些 Shared/Static 方法 - 这会导致问题吗(如果需要我可以更改它)。

仅供参考 - 上面的代码应该被视为伪代码 - 我是临时输入的而不是复制粘贴的 - 因此它可能包含语法错误。

终于搞定了。

所以,我无法让 MyWrapper class 使用 Ninject。我在这里的假设是,因为这是一个 Web 表单应用程序(而不是 MVC),管道是不同的并且 MyWrapper class 不是 运行 通过相同的管道,所以 Ninject 永远不会意识到

这是我对 "fix" 我的问题所做的。

我创建了一个新的基本页面

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 class 以包含一个新的成员变量和构造函数

private ReadOnly _service As IService

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

所以,有了上面的内容,我现在可以在我的网页 (MyPage.aspx.vb)

中使用以下代码
wrapper.DoWork()

现在可以使用了。

作为健全性检查,我还向 IService 实现的 Constructor 和 Dispose 方法添加了代码,并将其记录下来以查看何时创建和处置对象。

从日志中,我可以看到我的服务对象已根据请求正确创建和处理。