MVC 3 beta + Dependency Resolver + Unity =出了问题

时间:2010-11-27 22:31:06

标签: c# dependency-injection unity-container asp.net-mvc-3

我尝试在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));
    }

任何人都可以帮助我吗?

4 个答案:

答案 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