MasterControllerFactory
各領域のすべての実装を含むを使用でき、IControllerFactory
どのファクトリがどの を構築できるかがわかりRequestContext
ます。これにより、実際には、領域だけでなく、あらゆるバリエーションに対して異なる ControllerFactory を選択できます。仕組みは次のとおりです。
IFilteredControllerFactory
すべてのエリア コントローラ ファクトリの実装は、 の代わりに実装する必要がありIControllerFactory
ます。ここにあります:
public interface IFilteredControllerFactory:IControllerFactory
{
bool CanHandle(RequestContext requestContext);
}
エリア名に基づいてフィルタリングする実装の例は、次のようになります。
public class Area51ControllerFactory:IFilteredControllerFactory
{
public bool CanHandle(RequestContext requestContext)
{
return requestContext.RouteData.DataTokens["area"].ToString().ToLowerInvariant() == "area51";
}
public IController CreateController(RequestContext requestContext, string controllerName)
{
// create a controller...
}
public void ReleaseController(IController controller)
{
// release the controller...
}
}
MasterControllerFactory
次に、次のようなが必要です。
public class MasterControllerFactory : DefaultControllerFactory
{
private readonly List<IFilteredControllerFactory> _slaveFactories;
public MasterControllerFactory()
{
_slaveFactories = new List<IFilteredControllerFactory>();
}
public void RegisterFactory(IFilteredControllerFactory slaveFactory)
{
if(slaveFactory!=null && !_slaveFactories.Contains(slaveFactory))
{
_slaveFactories.Add(slaveFactory);
}
}
public override IController CreateController(RequestContext requestContext, string controllerName)
{
var factory = _slaveFactories.FirstOrDefault(x => x.CanHandle(requestContext));
if(factory!=null)
{
return factory.CreateController(requestContext, controllerName);
}
return base.CreateController(requestContext, controllerName);
}
public override void ReleaseController(IController controller)
{
bool released = false;
if (controller is Controller)
{
var requestContext = ((Controller) controller).ControllerContext.RequestContext;
var factory = _slaveFactories.FirstOrDefault(x => x.CanHandle(requestContext));
if (factory != null)
{
factory.ReleaseController(controller);
released = true;
}
}
if(!released)base.ReleaseController(controller);
}
}
あなたの Application_Start では、global.asax
まだすべてを設定する必要がありますが、それは簡単です。
var masterControllerFactory = new MasterControllerFactory();
masterControllerFactory.Register(new Area51ControllerFactory());
ControllerBuilder.Current.SetControllerFactory(masterControllerFactory);
明らかに、コーディング スタイルとアプリケーション アーキテクチャで最適に動作するように、さまざまな方法でこれを微調整できます。