【问题标题】:asp.net unity dependency injection doesn't work wellasp.net 统一依赖注入不能正常工作
【发布时间】:2023-03-03 12:20:02
【问题描述】:

我使用的是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 = “家庭控制器”。异常发生时:解决时。

异常是:InvalidOperationException - 当前类型 System.Web.Mvc.IController 是一个接口,无法构造。您是否缺少类型映射?

异常时,容器为:Resolving System.Web.Mvc.IController,homecontroller"**

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

_innerFactory.CreateController(requestContext, controllerName);

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

【问题讨论】:

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


    【解决方案1】:

    我建议您查看following blog post,它说明了如何在 ASP.NET MVC 3 应用程序中使用自定义的 DependencyResolver 和 Unity。

    【讨论】:

    • 嗯,谢谢,但我真的很想知道为什么会失败,仅仅是因为 [Dependency] 属性吗?
    • @baboonWorksFine,不,这是因为您的自定义控制器工厂和UnityDependencyResolver 之间存在冲突。这两者是互斥的。因此,您应该像以前那样编写自定义控制器工厂,或者依赖统一提供的控制器工厂。我建议你在 ASP.NET MVC 3 中使用依赖解析器,因为它允许你将许多地方的依赖注入到框架中。
    猜你喜欢
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    • 2015-11-08
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多