确保控制器在Unity中具有无参数的公共构造函数
我在控制器中遇到了这个问题:
尝试创建类型为“ * .WebMvc.Controllers.HomeController”的控制器时发生错误。 确保控制器具有无参数的公共构造函数。
找到ApiController的解决方案,但没有找到任何关于普通控制器的信息。
从头开始创建新的MVC 4项目。
HomeController.cs:
public class HomeController : Controller { private IAccountingUow _uow; public HomeController(IAccountingUow uow) { _uow = uow; }
UnityDependencyResoler.cs:
public class UnityDependencyResolver : IDependencyResolver { private IUnityContainer _container; public UnityDependencyResolver(IUnityContainer container) { _container = container; RegisterTypes(); } public object GetService(Type serviceType) { try { return _container.Resolve(serviceType); }catch { return null; } } public IEnumerable GetServices(Type serviceType) { try { return _container.ResolveAll(serviceType); }catch { return null; } } private void RegisterTypes() { _container.RegisterType(); } }
Global.asax中
protected void Application_Start() { //Omitted DependencyResolver.SetResolver( new UnityDependencyResolver( new UnityContainer())); }
调试并发现,甚至没有尝试解决IAccountingUow。
我做错了什么? 整天思考它。
发现问题出在哪里。 也许有人会面对同样的问题。 问题是Unity无法解析IAccountingUow
,因为接口的层次依赖性。
AccountingUow
类有两个contuctors
public AccountingUow( IRepositoryProvider repositoryProvider) { Init(repositoryProvider); } public AccountingUow() { Init( new RepositoryProvider(new RepositoryFactories()) ); }
依赖性解析器不应该采用默认的无参数构造函数。 它尝试接受依赖于接口的构造函数并且无法解析它,因为没有解决它的规则。
我注释掉了依赖于接口的构造函数,一切正常。
我将在以后的解析器中发布第一个构造函数,也许有人会使用它。
这也可能是由于正在解析的外部类型的参数注入构造函数中的exception。 该类型的构造函数的依赖关系可能会成功解析,但如果外部构造函数中存在exception,Unity会将其报告为“ Type
Test.Controllers.MyControllerWithInjectedDependencies
没有默认构造函数”。