IBootstrapperTask
arabirimini uygulayan türleri bulmak için bir ASP.NET MVC uygulamasında tüm Assemblies'lara bakan bir Bootstrapper'ım var ve bunları kaydeder bir IOC Contrainer. Buradaki fikir, IBootstrapperTasks'ınızı istediğiniz yere yerleştirebilmeniz ve Projelerinizi nasıl düzenlediğinizi düzenlemenizdir. Önyükleyicisi içinASP.NET - AppDomain.CurrentDomain.GetAssemblies() - AppDomain yeniden başlatıldıktan sonra Assemblies eksik
Kodu: benim çözümde AppDomain.CurrentDomain.GetAssemblies()
döner tüm Meclisleri (bütün GAC kişinin ama bu beni rahatsız etmez dahil) tam bir yapı sonra
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
}
}
.
Ancak AppDomain yeniden başlatılırsa, yoksa 'sıçrama' Web.config dosyası (boşluk ekleyerek ve tasarrufu), statik yapıcı yeniden çalıştırılır ancak AppDomain.CurrentDomain.GetAssemblies()
çağrıldığında, Meclisleri en eksik IBootstrapperTask türleri içeren bir tane dahil.
Bu soruna nasıl girebilirim? Sanırım System.IO/bin dizinini kullanabilir ve tüm DLL'leri manuel olarak yükleyebilirim, ancak mümkünse bunu önlemek ister misiniz, yoksa tek yol mu? Buna doğru genel yaklaşımı mı kullanıyorum?
Bu, .NET 4.0 üzerinde çalışan bir ASP.NET MVC 2.0 uygulamasıdır, Visual Studio 2010 Cassini web sunucusundaki yerleşik sorunu ve Windows Server 2008'deki Tümleşik Boru Hattı Modunda IIS7.0 ile bu sorunu yaşıyorum.
Düzenleme: sadece bu rastladım SO ihtiyaç duydukları konum olarak AppDomain sadece Meclisleri yükler diyor Difference between AppDomain.GetAssemblies and BuildManager.GetReferencedAssemblies sonrası (örn o Birliğinden bir yöntemi/sınıf ilk çağrıldığında.). Önyükleyici çok erken çalıştığından, bu nedenle montajların neden AppDomain.CurrentDomain.GetAssemblies()
'da eksik olduğunu açıklayacağım sanırım. Ben Bootstrapper örn önce eksik Meclisinden 'şey' bir çağrı yerleştirilir eğer
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
MyApp.MissingAssembly.SomeClass someClass =
new MyApp.MissingAssembly.SomeClass();
Bootstrapper.Run();
}
}
... o sorunu çözmek gibi görünüyor, ama bir kesmek biraz.
Güzel soru ve cevap:
aşağıdaki benim Montaj bulucu kodunu yeniden kaleme aldık! Size bir blog turu attınız - iyi şeyler yazıyorsunuz. –