MVC3 - 使服务层工作

时间:2012-08-01 18:56:18

标签: c# asp.net-mvc asp.net-mvc-3 entity-framework

我正在尝试在我的应用程序中使用基本服务层,但是我遇到了麻烦。

接口:

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

2 个答案:

答案 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请求。