您可以使用一個MasterControllerFactory
,其中包含每個區域的所有IControllerFactory
實現,並知道哪個工廠可以構建哪個工廠。這實際上允許您爲任何變體選擇不同的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);
}
}
在您的global.asax
的Application_Start中,您仍然需要設置所有內容,但這很容易。
var masterControllerFactory = new MasterControllerFactory();
masterControllerFactory.Register(new Area51ControllerFactory());
ControllerBuilder.Current.SetControllerFactory(masterControllerFactory);
顯然,您可以通過多種方式來調整這種方法,以便最適合您的編碼風格和應用程序體系結構。
哦,是的,你可以;-) – smartcaveman 2011-03-20 06:25:36
@smartcaveman:謝謝你離開這個評論 - 通過這樣做你讓我1)學習新的東西2)upvoting你=) – 2011-03-21 03:38:17