1

まず第一に、私は 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 は reqiseter ではありませんが、autofac ビルダーで RegisterControllers を使用したため、IController を解決したいときにエラーが発生しました。

正しい方法でそれを行う方法を教えていただけますか?

4

1 に答える 1

2

インターフェイスを介してコントローラーを解決しているため、AsImplementedInterfacesメソッドを使用してコントローラーを登録します。

builder.RegisterControllers(asm).AsImplementedInterfaces()
    .InstancePerHttpRequest();
于 2012-11-26T00:42:16.650 に答える