0

アプリケーションで基本的なサービスレイヤーを機能させようとしていますが、問題が発生しています。

インターフェース:

public interface IEmailer
    {
        string ServiceTest();
    }

サービス:

public class SimpleMailer : IEmailer
    {
    public string ServiceTest()
        {
            var ServiceVar = "This is your service working";
            return ServiceVar;
        }
    }

コントローラ:

    public class EmailSendController : Controller
    {

    private IEmailer _service;

     public EmailSendController()
        {
            _service = new SimpleMailer();

        }

        public EmailSendController(IEmailer service)
        {
            _service = service;
        }

        [HttpPost]
        public ActionResult Edit()
        {

            _service.ServiceTest();

            return View();
        }
    }
}

_service.ServiceTest();nullのエラーが発生します。それが戻るのを妨げている私が間違っているのは何ServiceVarですか?

4

2 に答える 2

1

それはすべて、どのコントローラーコンストラクターがヒットしているかによって異なります。IEmailerパラメーターを受け取るコンストラクターにアクセスする場合は、コンストラクターに提供するSimpleMailer具象クラスを作成する方法が必要になります。このインスタンスでこのコントローラーを作成する一般的な方法は、依存性注入を使用することです。null参照例外が発生したため、そのコンストラクターを使用してコントローラーを作成しようとしていると思います。

Ninjectコンテナの実装方法を正確に確認できるように、Global.asax.csコードと一緒にNinjectのマッピングコードを投稿していただけますか?コードを見ずに問題が何であるかを特定するのは難しいです。

Application_startでコンテナーを設定する必要があるだけでなく、Ninject用のIDependencyResolver実装も必要です。これは、NuGetを介して利用できるはずです。これにより、コントローラーを作成するために、コントローラーがパラメーターの具体的な実装を検索できるようになります。

于 2012-08-01T19:21:28.037 に答える
0

NinjectWebCommon.cs-> RegisterServices()(またはそのように使用する場合はglobal.asax-> )に次のものがあることを確認してください。CreateKernel()

kernel.Bind<IEmailer>().To<SimpleMailer>().InRequestScope();

また、これがNinjectを介して機能していることをテストするために、パラメーターなしのコンストラクター(または今のところ'rem'を削除)を削除します。そうしないと、パラメーター化されたctorがヒットしません。

[編集]先ほど気づいたのですが、コードにアクションメソッドがないため、アクションHttpGetのシグネチャをに変更することをお勧めします。そうしないと、現在コントローラーに存在するものからgetリクエストを呼び出す方法がありません。HttpPostHttpGet

于 2012-08-01T19:56:46.913 に答える