0

URL を解析してデータベースからエンティティをロードする汎用コントローラ ファクトリを作成しました。

entity/products/123456.htm

ただし、エンティティが見つからない場合は実際のコントローラーをロードしたり、必要に応じて、URL パターンによって作成された「仮想」コントローラーではなく、物理コントローラーを作成してデフォルトのエンティティの動作をオーバーライドしたりしたいと考えています。

現在、global.asax.cs で私がやっている:

ControllerBuilder.Current.SetControllerFactory(typeof(EntityControllerFactory));

MVC のデフォルトのコントローラ/アクション スキームに引き継がせたい場合、EntityControllerFactory、またはここで、別のファクトリに制御を渡すにはどうすればよいですか?global.asax.cs

4

1 に答える 1

3

複合IControllerFactory実装を作成できます。

public class EntityControllerFactory : IControllerFactory {
    private IControllerFactory defaultFactory = new DefaultControllerFactory();

    public IController CreateController(RequestContext requestContext, string controllerName) {
        if(needsCustomLogic) {
            // do your custom logic here and return appropriate result
        } else {
            return defaultFactory.CreateController(requestContext, controllerName);
        }
    }

    // same for the other methods on IControllerFactory
}

デフォルトでは の値ControllerBuilder.Current.GetControllerFactory()は のインスタンスであるため、これは機能しますDefaultControllerFactory

GetControllerFactoryまた、デフォルトのインスタンスを取得してファクトリに渡すことで、ファクトリをより将来性のあるものにすることを検討することもできます (MVC の新しいバージョンが から異なる型を返し始めた場合。可能性は低いですが、発生する可能性があります)。

// in Global.asax
var defaultFactory = ControllerBuilder.Current.GetControllerFactory();
ControllerBuilder.Current.SetFactory(new EntityControllerFactory(defaultFactory));
于 2011-03-23T20:59:01.003 に答える