我的技能让我失望了,我知道我已经看过相关代码,但找不到它。
获取任意 URL、通过 asp.net mvc 路由系统运行它并在另一端产生对 Controller 实例的引用的最快方法是什么?
例如,代码执行在某个任意 Controller 方法中。我想做这样的事情:
...
string myURL = "http://mysite/mycontroller/myaction/myparameters";
RouteData fakeRouteData = new RouteData(Route???, IRouteHandler???)
RequestContext ctxt = new RequestContext(this.ControllerContext.HttpContext,
fakeRouteData);
ControllerFactory factory = ControllerBuilder.Current.GetControllerFactory();
Controller result = factory.CreateController(ctxt, controllername???)
我正在尝试像路由系统一样获取 Controller 实例,而不管代码在何处执行。我不清楚此时如何将各个部分组合在一起。虽然我最终会发现它,但我想我可以通过在这里询问来节省时间;)
最佳答案
嗯...我不知道这是否是最好的解决方案,因为它需要模拟,但也许这会有所帮助。您走在正确的轨道上,一旦您知道要实例化什么 Controller , Controller 工厂部分就很简单,所以问题是从中获取 RouteData 对象的最快方法是什么一个任意的 url。
我知道的唯一方法是最小起订量:
string url = "~/Account/LogOn"; //trying to create Account controller in default MVC app
RouteCollection rc = new RouteCollection();
MvcApplication.RegisterRoutes(rc);
System.Web.Routing.RouteData rd = new RouteData();
var mockHttpContext = new Moq.Mock<HttpContextBase>();
var mockRequest = new Moq.Mock<HttpRequestBase>();
mockHttpContext.Setup(x => x.Request).Returns(mockRequest.Object);
mockRequest.Setup(x => x.AppRelativeCurrentExecutionFilePath).Returns(url);
RouteData routeData = rc.GetRouteData(mockHttpContext.Object);
string controllerName = routeData.Values["controller"].ToString();
IControllerFactory factory = ControllerBuilder.Current.GetControllerFactory();
IController controller = factory.CreateController(this.ControllerContext.RequestContext, controllerName);
我进行了大量谷歌搜索,但没有找到与单元测试/模拟无关的内容。我不知道是否有可以快速轻松地做到这一点,但我当然想知道是否有人有更好的解决方案!
关于c# - 从任意 URL 手动实例化 Controller 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2066615/