In der gleichen Lösung gibt es eine ASP.NET MVC4-Anwendung Slick.App
und Klassenbibliothek Awesome.Mvc.Lib
. Awesome.Mvc.Lib enthält eine Controller-Klasse.Controller in separater Assembly und Routing
public class ShinnyController : Controller
{
[HttpGet]
public string Index()
{
return "Hello, from Awesome.Mvc.Lib";
}
}
Wenn ich die Anwendung und Punkt die Referenz fügen Sie einfach Brower von Slick.App zu Awesome.Mvc.Lib, führen zu /shinny
, ich werde die Antwort tatsächlich sehen, „Hallo, von Awesome.Mvc.Lib“.
Das ist etwas, was ich überhaupt nicht erwarte. Die ganze Zeit dachte ich, dass ASP.NET MVC die Namespaces respektiert, in die die Controller gesteckt wurden. So werden die Controller aus anderen Namespaces nicht angezeigt, zumindest bevor ich nicht danach gefragt habe.
Ich habe versucht, die Standardroutenregistrierung zu ändern, um Namespaces-Parameter zu verwenden.
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
namespaces: new [] { "Slick.App.Controllers" }
);
Dennoch stimmt die ShinnyController-Route immer noch mit '/ shinny' überein.
Ich habe Bedenken, das ist richtig Standardverhalten. Meine Frage ist, wie explizit zu sagen, welche Controller ausgesetzt sind und verhindern, dass Standardroute Controller in separaten Klassenbibliothek übereinstimmen?
Unfortunatelly, das ist nicht genau das, was mein Problem ist. Mein Problem ist, dass ich keinen Zugriff auf die Host-Anwendung habe, daher würde die Erstellung einer benutzerdefinierten Controller-Factory für mich nicht funktionieren. –
@alexanderb: Nein, Sie können dies mit folgendem Befehl tun: [assembly: System.Web.PreApplicationStartMethod (typeof (MvcTools.Hooks.PreApplicationStartCode), "Start"]], siehe folgenden Link: http: //blog.davidebbo. com/2011/02/register-your-http-modules-at-runtime.html Dort in Start, tun Sie dies: System.Web.Mvc.ControllerBuilder.Current.SetControllerFactory (YOUR_ControllerFactory)); Alles, was Sie tun müssen, ist, dass die Host-Anwendung Ihre DLL lädt, was Sie mit einem web.config-Eintrag erreichen können;) –