我尝试在Unity中使用Dependency Resolver,并在我的Controller创建时遇到了一些问题。 这里是控制器的例子:
public class AccountController : Controller
{
private readonly ICourseService _courseService;
public AccountController(ICourseService courseService)
{
_courseService = courseService;
}
}
但是,当Controller尝试创建时 - 我得到了一个异常“没有为此对象定义无参数构造函数。”我甚至尝试为此控制器添加默认构造函数,但是courseService没有创建。还尝试使用[Dependency]属性添加属性 - 没有任何反应。 这是Dependency Resolver类:
public class UnityDependencyResolver : IDependencyResolver
{
private readonly IUnityContainer _container;
public UnityDependencyResolver(IUnityContainer container)
{
_container = container;
}
public object GetService(Type serviceType)
{
return _container.IsRegistered(serviceType) ? _container.Resolve(serviceType) : null;
}
public IEnumerable<object> GetServices(Type serviceType)
{
return _container.IsRegistered(serviceType) ? _container.ResolveAll(serviceType) : new List<object>();
}
}
和Global.asax.cs:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
var container = new UnityContainer();
container.RegisterType<ICourseService, CourseService>();
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
}
任何人都可以帮助我吗?
答案 0 :(得分:5)
旧帖但这些其他答案都是错误的。我今天遇到这个问题,你肯定不需要注册控制器或控制器工厂。此消息仅表示控制器的依赖关系层次结构中的某些内容未注册。例如。如果您的控制器在其构造函数中需要IService并且IService在其构造函数中需要IRepository,但您忘记注册IRepository,则会出现此错误。
答案 1 :(得分:2)
您的IDependencyResolver实现要求注册AccountController。尝试添加此注册,否则它将返回null,MVC将尝试使用需要无参数ctor的Activator创建控制器。
答案 2 :(得分:1)
如果您的控制器依赖于具体的非注册类型,则上面的代码将会中断。您应该将GetService()修改为以下内容:
public object GetService(Type serviceType){
if (!container.IsRegistered(serviceType)){
if (serviceType.IsAbstract || serviceType.IsInterface){
return null;
}
}
return container.Resolve(serviceType);
}
这样,如果说CourseService依赖于具体的CourseRepository,容器将实例化它。
我与DanH一起假设在层次结构中的某个地方存在缺失的类型注册,或者对未被实例化的具体类型的依赖。
我有同样的问题,并发现以下文章有用:
http://xhalent.wordpress.com/2011/01/17/using-unity-as-a-dependency-resolver-asp-net-mvc-3/
答案 3 :(得分:0)
您的问题是MVC仍在尝试使用默认控制器工厂实例化控制器,这需要一个无参数构造函数,并且不了解您的Unity容器或如何解决ICourseService依赖关系。
你需要构建一个自定义控制器工厂来利用Unity(特别是覆盖GetControllerInstance(Type type)
的工厂 - 应该有大量的文档和示例;这是一个简单的类 - 然后在{ {1}}如下:
Application_Start