Mvc中No parameterless constructor defined for this object错误如何解决?
How to solve No parameterless constructor defined for this object error in Mvc?
我正在创建一个演示应用程序来学习如何使用存储库模式来执行插入 operation.I 我正在使用 Nop Commerce**(http://www.nopcommerce.com) **存储库模式代码
错误:没有为此对象定义无参数构造函数
我看过这个link: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);
}
我的 Class 将实现该接口(服务):
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
获取错误:没有为此对象定义无参数构造函数
我研究过这个错误,所有消息来源都说使用依赖注入来解决这个错误。
谁能指导我如何使用依赖注入来解决这个错误??
你是对的 - 你需要使用 Unity、Ninject 或 Autofac 之类的东西来获得这个 运行。
基本上 - 无论使用何种技术,步骤大致相同。
以unity为例:
1) 在您的 MVC 项目中,使用 NuGet 添加 "Unity Bootstrapper for MVC"。 (右键引用,管理nuget包,在线搜索unity,select "Unity Bootstrapper for MVC"
这将为您的项目添加一些内容 - 最有趣的是 App_start 中的 unityConfig.cs。
2) 在 unityConfig.cs 中 - 找到 RegisterTypes 方法
RegisterTypes 是您告诉统一容器 "when you need one of X, use implementation Y" 的地方 - 在您的情况下 "when you need an IEmployeeService, use EmployeeService"
3) 在寄存器类型中 - 添加您的类型映射 - 例如,在您的情况下:
container.RegisterType<IEmployeeService, EmployeeService>();
AND
4) 有点复杂:因为您有 IRepository 并且您需要它来正确解析您的 employeeService 您还必须针对通用实现注册一个通用类型(它是有点奇怪)。看看你的类型,它会是这样的:
container.RegisterType(typeof(IRepository<>), typeof(Repository<>));
(您需要根据您的项目解析命名空间)。
所以 - 这就是说...
Right MVC - when you need an IEmployeeService use employeeService, and
when you need an IRepository<>, use Repository<>
现在 - 由于在 NuGet 安装期间添加了 webActivator(就在 UnityConfig.cs 的隔壁),应该就是这样 - webActivator 将 DependencyResolver.Current 设置为使用此 unityContainer 的东西.
正因为如此,MVC 现在将在尝试实例化您的控制器时使用这个新的 unityContainer,并在途中解析类型映射。
webActivator 和 unityConfig 类 为您做了很多繁重的工作,只需精心设计 registerTypes,您至少应该在解决方案中立足。
HTH - 祝你好运。
PS - DI 本身是一个庞大的主题 - 在这里太多了,你会遇到各种奇怪而美妙的事情(为决议提供 Ctor args,生命周期管理只是一个开始! ) - 这很有趣,但不是微不足道的,所以如果这不起作用,你将不得不原谅我 "out of the box"(认为它几乎是不切实际的) - 这只是一个模糊的尝试,试图给你一个立足点在主题中!
有关 unity 的更多信息 - 我建议您阅读 here (Dev guide to using Unity on MSDN)
也许您目前正在将一个对您来说太复杂的项目作为示例。 Nopcommerce 是一个大而全的产品,有很多元素,所以很容易迷路。不是了解存储库模式如何工作的最佳示例,但我当然建议您在清楚地了解基本概念以查看它们在实际场景中的使用后再次检查它。
NopCommerce 使用 Autofac for dependency injection, a very popular IoC container. You can look for a class called DependencyRegistrar
in the project Nop.Web.Framework
to see how it is used, if you're curious about it. You can get more examples on how to use dependency injection with Autofac in their repository and their getting started guide.
我的建议是寻找更易于理解的示例。对于初学者来说,任何流行的 IoC 容器都可以,除非您有自己的选择标准。例如,您可以关注 Autofac's guide for MVC
我正在创建一个演示应用程序来学习如何使用存储库模式来执行插入 operation.I 我正在使用 Nop Commerce**(http://www.nopcommerce.com) **存储库模式代码
错误:没有为此对象定义无参数构造函数
我看过这个link: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);
}
我的 Class 将实现该接口(服务):
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
获取错误:没有为此对象定义无参数构造函数
我研究过这个错误,所有消息来源都说使用依赖注入来解决这个错误。
谁能指导我如何使用依赖注入来解决这个错误??
你是对的 - 你需要使用 Unity、Ninject 或 Autofac 之类的东西来获得这个 运行。
基本上 - 无论使用何种技术,步骤大致相同。
以unity为例:
1) 在您的 MVC 项目中,使用 NuGet 添加 "Unity Bootstrapper for MVC"。 (右键引用,管理nuget包,在线搜索unity,select "Unity Bootstrapper for MVC"
这将为您的项目添加一些内容 - 最有趣的是 App_start 中的 unityConfig.cs。
2) 在 unityConfig.cs 中 - 找到 RegisterTypes 方法
RegisterTypes 是您告诉统一容器 "when you need one of X, use implementation Y" 的地方 - 在您的情况下 "when you need an IEmployeeService, use EmployeeService"
3) 在寄存器类型中 - 添加您的类型映射 - 例如,在您的情况下:
container.RegisterType<IEmployeeService, EmployeeService>();
AND
4) 有点复杂:因为您有 IRepository 并且您需要它来正确解析您的 employeeService 您还必须针对通用实现注册一个通用类型(它是有点奇怪)。看看你的类型,它会是这样的:
container.RegisterType(typeof(IRepository<>), typeof(Repository<>));
(您需要根据您的项目解析命名空间)。
所以 - 这就是说...
Right MVC - when you need an IEmployeeService use employeeService, and when you need an IRepository<>, use Repository<>
现在 - 由于在 NuGet 安装期间添加了 webActivator(就在 UnityConfig.cs 的隔壁),应该就是这样 - webActivator 将 DependencyResolver.Current 设置为使用此 unityContainer 的东西.
正因为如此,MVC 现在将在尝试实例化您的控制器时使用这个新的 unityContainer,并在途中解析类型映射。
webActivator 和 unityConfig 类 为您做了很多繁重的工作,只需精心设计 registerTypes,您至少应该在解决方案中立足。
HTH - 祝你好运。
PS - DI 本身是一个庞大的主题 - 在这里太多了,你会遇到各种奇怪而美妙的事情(为决议提供 Ctor args,生命周期管理只是一个开始! ) - 这很有趣,但不是微不足道的,所以如果这不起作用,你将不得不原谅我 "out of the box"(认为它几乎是不切实际的) - 这只是一个模糊的尝试,试图给你一个立足点在主题中!
有关 unity 的更多信息 - 我建议您阅读 here (Dev guide to using Unity on MSDN)
也许您目前正在将一个对您来说太复杂的项目作为示例。 Nopcommerce 是一个大而全的产品,有很多元素,所以很容易迷路。不是了解存储库模式如何工作的最佳示例,但我当然建议您在清楚地了解基本概念以查看它们在实际场景中的使用后再次检查它。
NopCommerce 使用 Autofac for dependency injection, a very popular IoC container. You can look for a class called DependencyRegistrar
in the project Nop.Web.Framework
to see how it is used, if you're curious about it. You can get more examples on how to use dependency injection with Autofac in their repository and their getting started guide.
我的建议是寻找更易于理解的示例。对于初学者来说,任何流行的 IoC 容器都可以,除非您有自己的选择标准。例如,您可以关注 Autofac's guide for MVC