尝试创建“CatalogController”类型的控制器时发生错误。确保控制器具有无参数公共构造函数。
当您从控制器请求资源时,框架需要处理该请求。因此,路由识别控制器、操作等,然后需要实例化控制器的实例才能调用所需的方法。
为了做到这一点,他要么需要一个公共的空构造函数,要么需要某种方法来解决构造函数的依赖关系。
在您的情况下,您有一个 ctor 依赖于 ICatalogModelFactory。该框架将需要您实现一个Dependency Resolver,并在应用程序启动时注册新的解析器(Global.asax),如下所示:
DependencyResolver.SetResolver(new MyDependencyResolver());
这是 UnityContainer 自定义依赖项解析器的示例,如在此 link 中找到的:
public class UnityDependencyResolver : IDependencyResolver
{
IUnityContainer container;
public UnityDependencyResolver(IUnityContainer container)
{
this.container = container;
}
public object GetService(Type serviceType)
{
try
{
return container.Resolve(serviceType);
}
catch
{
return null;
}
}
public IEnumerable<object> GetServices(Type serviceType)
{
try
{
return container.ResolveAll(serviceType);
}
catch
{
return new List<object>();
}
}
}
注册发生在Global.asax Application_Start方法中:
IUnityContainer container = GetUnityContainer();
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
顺便说一句,另一种方法是创建一个 ControllerFactory 并简单地使用 DI 容器解析控制器。我更喜欢使用依赖解析器来解析控制器。