如何解决在Mvc中为此对象错误定义的无参数构造函数?

时间:2015-02-24 11:24:46

标签: asp.net-mvc dependency-injection nopcommerce

我正在创建一个演示应用程序来学习如何使用存储库模式来执行插入操作。我正在使用Nop Commerce **(http://www.nopcommerce.com)**代码用于存储库模式

错误:没有为此对象定义无参数构造函数

我看过这个链接:MVC: No parameterless constructor defined for this object

这是我的结构:

我的存储库界面

public partial interface IRepository<T>
    {
        void Insert(T entity);
     }

我的服务层

 public partial interface IEmployeeService
    {
        void InsertCategory(EmployeeMaster employeeMaster);
    }

我的类将实现该接口(服务)

public partial class EmployeeService : IEmployeeService
    {
        #region Fields
        private readonly IRepository<EmployeeMaster> _employeeMasterRepository;
        #endregion

        #region Ctor
        public EmployeeService
            (
            IRepository<EmployeeMaster> employeeMasterRepository
            )
         {
             this._employeeMasterRepository = employeeMasterRepository;
         }

        #endregion



public virtual void InsertCategory(EmployeeMaster employeeMaster)
        {
            if (employeeMaster == null)
                throw new ArgumentNullException("employeeMaster");

            _employeeMasterRepository.Insert(employeeMaster);
}

这是我的控制者:

public class HomeController : Controller
    {
        #region Fields
        private readonly IEmployeeService  _employeeService;
        #endregion

 #region Constructors
        public HomeController
        (
            IEmployeeService employeeService
        )
        {
            this._employeeService = employeeService;
        }
        #endregion

获取错误:没有为此对象定义无参数构造函数

我已经研究过这个错误,所有的消息来源都说使用依赖注入来解决这个错误。

有人可以指导我如何使用依赖注入来解决这个错误吗?

2 个答案:

答案 0 :(得分:4)

也许您现在正在考虑一个过于复杂的项目样本。 Nopcommerce是一个功能齐全的大型产品,具有很多元素,因此容易迷失。不是了解存储库模式如何工作的最佳示例,但我确实建议您在基本概念清晰后再次检查它,以便在实际场景中使用它们。

NopCommerce使用Autofac进行依赖注入,这是一个非常受欢迎的IoC容器。您可以在项目DependencyRegistrar中查找名为Nop.Web.Framework的课程,看看它是如何使用的,如果您对它感到好奇的话。您可以获得更多关于如何在其存储库及其getting started guide中使用Autofac进行依赖注入的示例。

我的建议是寻找一个更容易理解的例子。对于初学者来说,任何流行的IoC容器都可以,直到您有自己的标准来选择一个。例如,您可以关注Autofac's guide for MVC

答案 1 :(得分:3)

你是正确的 - 你需要使用像Unity,Ninject或Autofac这样的东西来运行它。

基本上 - 无论使用何种技术,步骤大致相同。

以unity为例:

1)在你的MVC项目中,使用NuGet为MVC添加&#34; Unity Bootstrapper&#34;。 (右键单击引用,管理nuget包,在线搜索 unity ,选择&#34; Unity Bootstrapper for MVC&#34;

这将为您的项目添加一些东西 - 最有趣的是App_start中的unityConfig.cs。

2)在unityConfig.cs中 - 找到 RegisterTypes 方法

RegisterTypes 是你告诉统一容器的地方&#34;当你需要一个X时,使用实现Y&#34; - 在您的情况下&#34;当您需要IEmployeeService时,请使用EmployeeService&#34;

3)在寄存器类型中 - 添加类型映射 - 例如,在您的情况下:

container.RegisterType<IEmployeeService, EmployeeService>();

4)有点复杂:因为你有IRepository 而你需要这个来正确解决你的employeeService 你还必须针对通用实现注册一个泛型类型(它&#39;有点奇怪)。看看你的类型,它会是这样的:

container.RegisterType(typeof(IRepository&lt;&gt;),typeof(Repository&lt;&gt;));

(您需要根据您的项目解析名称空间)。

所以 - 这就是说......

  

正确的MVC - 当您需要IEmployeeService时使用employeeService,和   当您需要IRepository&lt;&gt;时,请使用Repository&lt;&gt;

现在 - 由于在NuGet安装期间(UnityConfig.cs的隔壁)添加了webActivator,应该是它 - webActivator将DependencyResolver.Current设置为使用此unityContainer的东西。

因此,MVC现在将使用这个新的unityContainer,只要它试图实例化你的控制器,解决路上的类型映射。

webActivator和unityConfig类为你做了很多繁重的工作,只是精心设计了registerTypes,你至少应该在解决方案中占据一席之地。

HTH - 祝你好运。

PS-DI本身就是一个巨大的主题 - 对于这里来说太过分了,你会遇到各种奇怪而奇妙的事情(为决议提供Ctor args,只为一开始提供终身管理!) - 它&# 39;有趣,但不是微不足道的,所以如果这不起作用,你将不得不原谅我。#34;开箱即用&#34; (认为​​这样做几乎是不切实际的) - 这只是一个模糊的尝试,让你在这个主题上立足!

有关团结的更多信息 - 建议您阅读here (Dev guide to using Unity on MSDN)