我正在尝试在我的应用程序中使用基本服务层,但是我遇到了麻烦。
接口:
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
?
答案 0 :(得分:1)
这一切都取决于被击中的控制器构造函数。如果您正在访问带有IEmailer参数的构造函数,那么您需要有一种方法来创建SimpleMailer具体类以提供给构造函数。使用该实例创建此控制器的典型方法是使用依赖注入。我假设它正在尝试使用该构造函数创建控制器,因为发生了空引用异常。
您能否发布Ninject的映射代码以及Global.asax.cs代码,以便我们确切了解您如何实施Ninject容器?如果没有看到代码,很难确定问题所在。
您不仅需要在Application_start中设置容器,而且还需要Ninject的IDependencyResolver实现,如果你看,它应该可以通过NuGet获得。这就是你的控制器能够如何查找参数的具体实现以创建控制器。
答案 1 :(得分:0)
确保您的NinjectWebCommon.cs
- >中包含以下内容: RegisterServices()
(或global.asax
- > CreateKernel()
,如果你这样使用的话):
kernel.Bind<IEmailer>().To<SimpleMailer>().InRequestScope();
此外,删除无参数构造函数(或者现在'rem'),以便通过Ninject测试它是否正常工作,否则参数化的ctor永远不会被命中。
[编辑] 刚刚注意到,您的代码中没有HttpGet
操作方法,因此我建议您将HttpPost
操作的签名更改为{{ 1}},否则,您无法从当前控制器中存在的任何内容调用get请求。