自定义的ControllerFactory与autofac [英] Custom ControllerFactory with autofac

查看:264
本文介绍了自定义的ControllerFactory与autofac的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

首先我在ASP MVC中的新手,所以请耐心等待。

First of all i am a newbie in asp mvc so please be patient.

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

Currently I want to create project where autofac will be IoC container i will reqister custom controller factory. In custom controller factory I want to set implementation Data Repository via constructor of controller.

我认为应该以这种方式来完成:

I thought it should be done in that way:

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

        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

我的控制器工厂code:

My Controller factory code:

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不是reqiseter但我用RegisterControllers在autofac建设者。

Controller map is empty. WHen i want to resolve IController i receive and error because IController is not reqiseter but i used RegisterControllers in autofac builder.

你能解释我如何去做正确的方式?

Could you explain me how to do it in the right way?

推荐答案

既然你是通过接口解决控制器,使用 AsImplementedInterfaces 方法来注册控制器。

Since you are resolving controllers through interfaces, use the AsImplementedInterfaces method to register the controllers.

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

这篇关于自定义的ControllerFactory与autofac的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆