Zuallererst ist es sicherlich eine gute Idee, Ihr Modell in ein separates Projekt zu integrieren. Wie Sie festgestellt haben, ist dies trivial.
In Bezug auf Controller und Ansichten sehe ich keinen offensichtlichen Vorteil darin, sie für die meisten grundlegenden Projekte zu trennen, obwohl Sie dies möglicherweise in einer bestimmten Anwendung besonders tun müssen.
Wenn Sie sich dafür entscheiden, müssen Sie dem Framework mitteilen, wie Sie Ihre Controller finden. Der grundlegende Weg, dies zu tun, ist die Bereitstellung Ihrer eigenen ControllerFactory. Sie können sich den Quellcode für die DefaultControllerFactory ansehen, um eine Vorstellung davon zu erhalten, wie dies gemacht wird. Das Subtypisieren dieser Klasse und das Überschreiben der GetControllerType-Methode (string controllerName) kann ausreichen, um das zu erreichen, was Sie verlangen.
Nachdem Sie Ihre eigene benutzerdefinierte ControllerFactory erstellt haben, fügen Sie Application_Start in global.asax die folgende Zeile hinzu, um dem Framework mitzuteilen, wo es zu finden ist:
ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory());
Update: Lesen Sie diesen Beitrag und die Beiträge, auf die er verweist, um weitere Informationen zu erhalten. Siehe auch Phil Haacks Kommentar zu diesem Beitrag über:
ControllerBuilder.Current.DefaultNamespaces.Add(
"ExternalAssembly.Controllers");
... was keine vollständige Lösung ist, aber möglicherweise gut genug für einfache Fälle.