【问题标题】:Custom ControllerFactory with autofac带有 autofac 的自定义 ControllerFactory
【发布时间】:2012-11-25 21:01:26
【问题描述】:

首先我是asp mvc的新手,所以请耐心等待。

目前我想创建项目,其中 autofac 将是 IoC 容器,我将要求自定义控制器工厂。在自定义控制器工厂中,我想通过控制器的构造函数设置实现数据存储库。

我认为应该这样做:

ContainerBuilder builder = new ContainerBuilder();
        builder.RegisterControllers(asm).InstancePerHttpRequest();
        builder.Register(s => new ControllerFactory()).As<IControllerFactory>();
        IContainer container = builder.Build();

        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

我的控制器工厂代码:

internal class ControllerFactory : DefaultControllerFactory
{
    private readonly Dictionary<string, Func<RequestContext, IController>> _controllerMap;

    public ControllerFactory()
    {
        List<IController> lstControllers = DependencyResolver.Current.GetServices<IController>().ToList();
        _controllerMap = new Dictionary<string, Func<RequestContext, IController>>();

        foreach (Controller contr in lstControllers)
        {
            string ctrName = contr.ControllerContext.RouteData.Values["Controller"].ToString();
            _controllerMap.Add(ctrName, c => contr);
        }
    }

    public override IController CreateController(RequestContext requestContext, string controllerName)
    {

        if (_controllerMap.ContainsKey(controllerName))
        {
            return _controllerMap[controllerName](requestContext);
        }
        else
            throw new KeyNotFoundException(controllerName);
    }
}

控制器映射为空。当我想解决 IController 时收到错误,因为 IController 不是 reqseter,但我在 autofac builder 中使用了 RegisterControllers。

你能解释一下如何以正确的方式做吗?

【问题讨论】:

    标签: asp.net-mvc-3 dependency-injection autofac controller-factory


    【解决方案1】:

    由于您是通过接口解析控制器,因此请使用AsImplementedInterfaces 方法注册控制器。

    builder.RegisterControllers(asm).AsImplementedInterfaces()
        .InstancePerHttpRequest();
    

    【讨论】:

    • 感谢您的回答。它解决了我所有的问题。即使在 autofac wiki 上的示例中也没有这样的示例。
    • InstancePerHttpRequest 已过时。你可以简单地使用InstancePerRequest
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-09
    • 2017-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多