我有一個引導程序,它通過ASP.NET MVC應用程序中的所有程序集查找實現IBootstrapperTask
接口的類型,然後將它們註冊到國際奧委會承辦人。這個想法是,你可以文學上將你的IBootstrapperTasks放在任何地方,並組織你的項目。ASP.NET - AppDomain.CurrentDomain.GetAssemblies() - AppDomain重啓後丟失的程序集
規範引導程序:
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
}
}
完全構建,AppDomain.CurrentDomain.GetAssemblies()
返回所有組件在我的解決方案(包括所有的GAC一個人的,但這並不影響我)之後。
然而,如果在AppDomain重新啓動,或者我「反彈」 Web.Config文件(加空格和保存),靜態構造函數再次運行,但是當AppDomain.CurrentDomain.GetAssemblies()
被調用時,大部分大會缺少包括一個包含我的IBootstrapperTask類型的文件。
我該如何解決這個問題?我想我可以在System.IO的/ bin目錄下手動加載所有的DLL,但是如果可能的話,寧願避免這種情況,或者這是唯一的方法嗎?我是否採取了正確的一般方法呢?
這是一個在.NET 4.0上運行的ASP.NET MVC 2.0應用程序,我在內置的Visual Studio 2010 Cassini Web服務器中遇到了這個問題,並且在Windows Server 2008上的集成管道模式下使用了IIS7.0。
編輯:我只是碰到這種來得如此張貼Difference between AppDomain.GetAssemblies and BuildManager.GetReferencedAssemblies它說在需要時自動在AppDomain只加載大會(例如,當從組裝方法/類是首先調用)。我想這可以解釋爲什麼大會在AppDomain.CurrentDomain.GetAssemblies()
上失蹤,因爲Bootstrapper很早就運行了。
我發現,如果我有條件「東西」打來的電話丟失大會前的引導程序如:
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
MyApp.MissingAssembly.SomeClass someClass =
new MyApp.MissingAssembly.SomeClass();
Bootstrapper.Run();
}
}
...這似乎解決了問題,但它是一個黑客攻擊的一位。
尼斯問答!參觀了你的博客 - 你寫了一些好東西。 – 2012-10-15 19:39:46