asp.net统一依赖注入不能很好地工作

时间:2011-09-07 06:54:00

标签: asp.net asp.net-mvc-3 unity-container

我正在使用asp.net的mvc 3框架,我创建了一个实现IControllerFactory接口的UnityControllerFactory:

...
public class UnityControllerFactory : IControllerFactory
{
    private IUnityContainer _container;
    private IControllerFactory _innerFactory;

    public UnityControllerFactory(IUnityContainer container)
        : this(container, new DefaultControllerFactory())
    {
    }

    protected UnityControllerFactory(IUnityContainer container,
                                     IControllerFactory innerFactory)
    {
        _container = container;
        _innerFactory = innerFactory;
    }
public IController CreateController(RequestContext requestContext,
                                        string controllerName)
    {
        try
        {
            IController controller = _container.Resolve<IController>(controllerName.ToLowerInvariant);

            return controller;
        }
        catch (Exception ex)
        {
            var msg = ex.Message;
            return _innerFactory.CreateController(requestContext, controllerName);
        }

    }
...

在Application_Start()中,我有:

protected void Application_Start() {
        AreaRegistration.RegisterAllAreas();
        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);


        IUnityContainer container = GetUnityContainer();
        container.RegisterType<IRepository<User>, LiveRepository<User>>();
        DependencyResolver.SetResolver(new UnityDependencyResolver(container));
        ControllerBuilder.Current.SetControllerFactory(new UnityControllerFactory(container));
        ...

    }

我用家庭控制器进行测试

public class HomeController : Controller{
    IRepository<User> userRepo;
    public HomeController(IRepository<User> userRepo)
    {
         this.userRepo = userRepo;
    }
    ...
}

当我运行应用程序时,我根本无法构建家庭控制器。 在行:

IController controller = _container.Resolve<IController>(controllerName.ToLowerInvariant);

我得到一个例外说:

**“依赖关系的解析失败,type =”System.Web.Mvc.IController“,name = “HomeController的”。在解决时发生异常。

异常是:InvalidOperationException - 当前类型System.Web.Mvc.IController是一个接口,无法构造。你错过了类型映射吗?

在异常时,容器是:解析System.Web.Mvc.IController,homecontroller“**

但即使使用默认控制器工厂:

_innerFactory.CreateController(requestContext, controllerName);

我仍然无法构建控制器,请帮助

1 个答案:

答案 0 :(得分:0)

我建议你看一下following blog post,它说明如何在ASP.NET MVC 3应用程序中使用Unity自定义DependencyResolver。