2016-10-07 5 views
1

.NET.NET 4.5.2で実行されているVB.NETで書かれたASP.NET WebフォームプロジェクトがありますiServiceを使用したASP.NET Webフォーム+ Ninject +ヘルパークラス - NinjectでiServiceを処理する方法

Ninjectをアプリケーションに正常に接続しましたが、問題が発生しました。

私はこれが私のアプリケーション内で、しかし

_myService.DoWork() 

大丈夫です...私のWebページ(以下のサンプル)

Partial Class MyPage 
    Inherits Page 

<Inject> 
Public Property _myService As IService 

以内にこの作品へのすべてのコールをNinjectプロパティ・インジェクションを使用しています

Public Class MyWrapper 

    <Inject> 
    Public Property _myService As IService 

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

End Class 

このクラスが使用されていますWebページによって...

Dim wrapper As New MyWrapper() 

wrapper.DoWork() 

これは機能しません - MyWrapperクラス内では、NinjectはIServiceを注入していません。

私のクラスはウェブページではないので、パイプラインにないので、Ninjectは何もしません。

私はMyWrapperを修正してNinject.Web.PageBaseから継承することを提案しているが、これを試しても動作しないように思われる他の投稿を読んだ。

誰にも何か提案がありますか?

MyWrapperはアプリケーション内で100以上の参照を持っていますので、理想的にはすべてのコード行を変更する必要はありません。

また、MyWrapperクラスにはShared/Staticメソッドがいくつかあります。これは問題を引き起こします(必要に応じて変更できます)。

FYI - 上記のコードは擬似コードで処理する必要があります。コピーして貼り付けるのではなく、アドホックで入力するため、構文エラーが含まれる可能性があります。

答えて

0

最後にそれを試しました。

したがって、MyWrapperクラスにNinjectを使用させることができませんでした。私の前提は、これはWebフォームアプリケーション(MVCではなく)なのでパイプラインが異なり、MyWrapperクラスは同じパイプラインで実行されないため、Ninjectはこれを認識しません。

ここで私の問題を「修正」しました。

は、私は新しい基本ページを作成し、私は以前にすることを言及するのを忘れてしまった

Partial Class MyPage 
    Inherits MyBasePage 

私はその後、上から継承するために私.aspx.vbページ(マイページ)に変更
Public Class MyBasePage 
    Inherits System.Web.UI.Page 

    <Inject> 
    Public Property wrapper As MyWrapper 
End Class 

...私は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 

ので、代わりに上記で、私は今、自分のWebページ(MyPage.aspxから次のコードを使用することができます。 vb)

wrapper.DoWork() 

これで機能します。

サニティチェックとして、IServiceの実装のConstructorメソッドとDisposeメソッドにコードを追加し、オブジェクトをいつ作成して廃棄するかを記録しました。

ログからは、サービスオブジェクトが正しく作成され、要求ごとに廃棄されていることがわかります。

関連する問題