まず第一に、私は 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 を解決したいときにエラーが発生しました。
正しい方法でそれを行う方法を教えていただけますか?