2012-04-22 30 views
5

私はNinjectを追加する 依存性注入

  • 使用NuGet新しいASP.NET Webフォームプロジェクトを作成します

    1. (ジェイソンの答え)How can I implement Ninject or DI on asp.net Web Forms?で見つかった以下のソリューションを試してみました。ウェブLIB
    2. はApp_Start/NinjectWebCommon.cs/RegisterServices方法
    3. 使用あなたのページに注射属性にカスタムバインディングを登録します(またNinject.Web.CommonとNinject LIBSをダウンさせるだろう)

    ASP.NET Webアプリケーションでうまく動作します。

    問題は、Webアプリケーションではなく、というWebサイトウェブサイトでDIのためにNinjectを使いたいという問題です。

    私はNinjectWebCommon/RegisterServicesでカスタムバインディングを登録:ウェブページで

    private static void RegisterServices(IKernel kernel) 
    { 
        kernel.Bind<ITestRepository>().To<TestRepository>(); 
    } 
    

    を、私はそれを注入:

    public partial class _Default : System.Web.UI.Page 
    { 
        [Inject] 
        public ITestRepository _repository { get; set; } 
    
        protected void Page_Load(object sender, EventArgs e) 
        { 
         System.Diagnostics.Trace.WriteLine(_repository.ExecuteOperation()); 
        } 
    } 
    

    それは常にnull参照の例外をスローしNinjectWebCommon.cs内部のブレークポイントがありますWebアプリケーションとは異なり、決して到達しませんでした。

    Ninject 3をWebサイトで動作させるには、他に何が必要ですか?

  • +0

    デバッガがアタッチするのが遅すぎるため、ブレークポイントがヒットすることに注意してください。 'Debug.Break()'を 'kernel.Bind <...> ... 'の前に書くと、その行にヒットします。 – nebffa

    答えて

    10

    私にとっての最初のアドバイスは...

    ASP.NET Webサイトを使用しないでください。彼らは忘れています。それらを避けてください。彼らは伝統的な理由のためだけにここに残っています。あなたは、あなたがそれを必要とするように、Webサイトのプロジェクトを使用頭痛薬に多額の投資を継続を主張する場合はアドバイスの

    私の2枚目...

    だろう。アドバイスの

    私の3枚目のようになります...

    は、まずアドバイスを参照してください。アドバイスの

    私の4枚目は、あなたがそれがWebサイトのプロジェクトだかいないかどうかを超える絶対的に制御することはできません場合は、単にNinjectや他のDIを使用してのアイデアをあきらめ...

    だろうコンテナ。 Webサイトプロジェクトは、Webアプリケーションサイトとは異なる基本クラスのセットを継承します。あなたはそれが同じように動作するようにはならないでしょうし、おそらくそれを適合させるために時間を過ごすでしょう。

    EDIT:

    基本的には、コードモデルは非常に異なるWebサイトとWebアプリケーションの間で動作します。 Webアプリケーションのアプリケーションは、Webサイトのアプリケーションが名前空間を持たないという事実だけを考える必要はありません。これは、これらがどのように大きく異なるかを示すはずです。

    アクティベーションプロセスが両方で同じように動作するかどうかは完全にはわかりません。

    しかし、すべてのことを言っている。あなたのコードには目障りな問題があります。あなたのページはNinject.Web.PageBaseではなくSystem.Web.UI.Pageから派生します

    +0

    +1ユーモアのため。悲しいかな、レガシーコードのすべての行を書き直すのは難しいでしょう。 – AFD

    +0

    @AndreiDrynov - 私は深刻だった。 Webサイトプロジェクトは地獄であり、彼らはあなたに多くの制限をかけます。がんばろう。 –

    +0

    私は既にあなたが言及したその頭痛の薬のマシンを使用しました))) – AFD

    1

    リンク先の他の質問によると、Ninject.Web.PageBaseから継承する必要があります。あなたのページはSystem.Web.UI.Pageから継承しているようですが、従属リポジトリの挿入方法はわかりません。

    +0

    Eric、残念なことにPageBaseはNinjectHttpApplication を見たいと思っていますが、Webサイトではそのクラスを使用していません – AFD

    +0

    あなたは運が不足していると思われます。 Ninjectをあなたのページにフックするには何かが必要です。 –