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();空错误。我做错了什么阻止它返回ServiceVar

4

2 回答 2

1

这一切都取决于被击中的控制器构造函数。如果您正在点击采用 IEmailer 参数的构造函数,那么您需要有一种方法来创建 SimpleMailer 具体类以提供给构造函数。使用该实例创建此控制器的典型方法是使用依赖注入。我假设它正在尝试使用该构造函数创建控制器,因为发生了空引用异常。

您能否将您的 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 工作,否则将永远不会命中参数化 ctor。

[编辑]刚刚注意到,您的代码中没有HttpGet操作方法,因此我建议您将HttpPost操作的签名更改为HttpGet,否则,您无法从当前控制器中存在的任何内容中调用获取请求。

于 2012-08-01T19:56:46.913 回答