2014-05-13 4 views
6

Ninject.Extensions.Conventions'ın önceki sürümlerinde, derlemeler için bir dizin taraması, arabirimlerle filtre sınıfları taraması ve sonra da tüm içeriğindeki dizme modüllerini yüklemek oldukça kolaydı. Ben en yeni sürüme son zamanlarda güncellenen sonraNinject -> Uyumlu arabirimler için taramaları birleştirme ve modüller olarak yükleme

kernel.Scan(scanner => 
    scanner.FromAssembliesInPath(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)) 
    scanner.AutoLoadModules(); 
    scanner.WhereTypeInheritsFrom<IPlugin>()); 

public class MyPlugin : NinjectModule, IPlugin { 

    public override void Load() { 
      Bind<IRepositoryFromPluginHost>().To<MyPluginImpl>().Named("special"); 
    } 
} 

Ancak, arayüzler tarafından

  • Filtre türlerini her şey gitmiş görünüyor ve ben

    1. Otomatik yük modüllerine edemiyorum

    mu Bunun için herkesin bir çözümü var mı?

  • cevap

    4

    Halen https://github.com/ninject/ninject.extensions.conventions uzantısı var.

    kernel.Bind(x => 
    { 
        x.FromAssembliesInPath("somepath") 
        .IncludingNonePublicTypes() 
        .SelectAllClasses() 
        .InheritedFrom<IPlugin>() 
        .BindDefaultInterface() // Binds the default interface to them; 
    }); 
    

    Güncelleme: nasıl bağlamak hakkında tüm IPlugin (yukarıdaki gibi) konvansiyonlar uzantısını kullanarak IPlugin ve sonra yapın:

    var plugins = IResolutionRoot.GetAll<IPlugin>(); 
    kernel.Load(plugins); 
    
    Ancak arayüz çizgisinde bir şey değişti
    +1

    Evet, ama tam olarak istediğim şey bu değil. Örneğiniz tüm sınıfları, belirli bir arabirimden miras alan ve varsayılan arabirime bağlanan belirli bir yoldaki derlemelerden yükler. Bununla birlikte, yapmak istediğim şey, Ninject modüllerini, ciltleme talimatlarının içinde bulunduğu montajlardan eklentiler olarak yüklemektir. – Acrotygma

    +0

    Üzgünüm, yanlış anladım. Bunu başarmanın bir yolu olup olmadığını araştıracağım. Varsayılan olarak Ninject StandardKernel, ´Ninject.Extensions.´ ile başlayan derlemelerde tüm ´IModule´leri otomatik olarak yükler, böylece kod erişilebilir olabilir. – BatteryBackupUnit

    +0

    Üzgünüm, beni çok uzun sürdü. Eklentileri nasıl kullandığımızı göstermek için cevabı güncelledik. Fazladan IPlugin bağlantılarının etrafta gezinmesini istemiyorsanız, Eric'in cevabı ile giderdim. – BatteryBackupUnit

    1

    Belki zor yol, ancak bunun gibi bir şey size NinjectModule'den türetilen türlerin bir listesini verecektir.

    var assemblies = AppDomain.CurrentDomain.GetAssemblies(); 
    List<Type> types = new List<Type>(); 
    foreach (var assembly in assemblies) 
    { 
        types.AddRange(GetModules(assembly)); 
    } 
    
    
        IEnumerable<Type> GetModules(Assembly assembly) 
        { 
         assembly.GetTypes() 
           .Where(t => t.BaseType == typeof(NinjectModule));  
        } 
    

    Modülünü yüklemek için bunu deneyin.

    (Activator.CreateInstance (tür), NinjectModule olarak) .Load();