Ich habe einen Bootstrapper, der alle Assemblies in einer ASP.NET MVC-Anwendung durchsucht, um Typen zu finden, die eine IBootstrapperTask
Schnittstelle implementieren, und registriert sie dann mit ein IOC Contrainer. Die Idee ist, dass Sie Ihre IBootstrapperTasks buchstäblich überall hinstellen und Ihre Projekte nach Belieben organisieren können.ASP.NET - AppDomain.CurrentDomain.GetAssemblies() - Assemblys fehlen nach AppDomain Neustart
-Code für Bootstrapper:
public class Bootstrapper
{
static Bootstrapper()
{
Type bootStrapperType = typeof(IBootstrapperTask);
IList<Assembly> assemblies = AppDomain.CurrentDomain.GetAssemblies();
List<Type> tasks = new List<Type>();
foreach (Assembly assembly in assemblies)
{
var types = from t in assembly.GetTypes()
where bootStrapperType.IsAssignableFrom(t)
&& !t.IsInterface && !t.IsAbstract
select t;
tasks.AddRange(types);
}
foreach (Type task in tasks)
{
if (!IocHelper.Container().Kernel.HasComponent(task.FullName))
{
IocHelper.Container().AddComponentLifeStyle(
task.FullName, task, LifestyleType.Transient);
}
}
}
public static void Run()
{
// Get all registered IBootstrapperTasks, call Execute() method
}
}
Nach einer vollständigen Build AppDomain.CurrentDomain.GetAssemblies()
gibt alle Baugruppen in meiner Lösung (einschließlich aller GAC jemandes aber das stört mich nicht).
Wenn jedoch die AppDomain neu gestartet wird, oder ich ‚Bounce‘ die Web.Config-Datei (das Hinzufügen eines Raumes und speichern), wird der statische Konstruktor erneut ausführen, aber wenn AppDomain.CurrentDomain.GetAssemblies()
genannt wird, meisten Baugruppen fehlen einschließlich desjenigen, der meine IBootstrapperTask-Typen enthält.
Wie kann ich dieses Problem umgehen? Ich denke ich könnte System.IO das Verzeichnis/bin und alle DLLs manuell dort einspielen, aber würde dies möglichst vermeiden, oder ist das der einzige Weg? Wende ich den richtigen allgemeinen Ansatz dazu?
Dies ist eine ASP.NET MVC 2.0-Anwendung unter .NET 4.0, ich bekomme dieses Problem mit dem integrierten Visual Studio 2010 Cassini-Webserver und mit IIS7.0 im integrierten Pipeline-Modus unter Windows Server 2008.
Edit: ich auf diese kam gerade sO Difference between AppDomain.GetAssemblies and BuildManager.GetReferencedAssemblies posten, die sagt der AppDomain nur die Baugruppen lädt wie sie benötigt werden (zB wenn eine Methode/Klasse von dieser Versammlung wird zuerst genannt.). Ich denke, das würde erklären, warum die Assemblys auf AppDomain.CurrentDomain.GetAssemblies()
fehlen, da der Bootstrapper sehr früh läuft.
Ich habe bemerkt, wenn ich einen Anruf auf ‚etwas‘ von der fehlenden Versammlung vor dem Bootstrapper zB platziert:
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
MyApp.MissingAssembly.SomeClass someClass =
new MyApp.MissingAssembly.SomeClass();
Bootstrapper.Run();
}
}
... es scheint, das Problem zu beheben, aber es ist ein bisschen wie ein Hack.
Nizza Frage und Antwort:
Ich habe meine Assembly-Locator-Code auf die folgenden neu geschrieben! Hat eine Tour von dir Blog - Sie schreiben ein paar gute Sachen. –