Frage

Nehmen Sie das folgende nutzlose Programm:

class Program
{
    static void Main(string[] args)
    {
        IUnityContainer unityContainer = new UnityContainer();
        IWindsorContainer windsorContainer = new WindsorContainer();

        Program unityProgram = unityContainer.Resolve<Program>();
        Program castleProgram = windsorContainer.Resolve<Program>();
    }
}

Die UnityContainer kehren mir eine Instanz des Programms, wo, wie der Windsor Behälter einen ComponentNotFoundException werfen.

kann ich Argumente für beide Verhaltensweisen sehen und nichts ausmacht, was ich mit, aber Prism V2 Tropfen 8 am Ende (spätestens zum Zeitpunkt des Schreibens) beruht auf der Unity Verhalten intern anfordernden Klassen, die nicht registriert sind.

Statt finden und registrieren alle diese Klassen für Prism würde ich viel eher wie Unity machen Windsor verhalten. Ich habe nichts auf Google gefunden mir dabei zu helfen zu tun (obwohl meine Terminologie falsch sein kann) und die Windsor Dokumentation ist ziemlich schlecht ...

Kann mir jemand eine Lösung für dieses Problem vor?

War es hilfreich?

Lösung

Windsor unterstützt derzeit nicht das, und es ist beabsichtigt. Die Argumentation ist, dass Sie explizit Typen, die Sie so müssen registriert sein, dass Sie falsch konfigurierte Objekt nicht bekommen.

Es gibt jedoch eine Möglichkeit, dass es einen Haken hinzugefügt werden, erstellen nicht-registrierte Typen irgendwann in naher Zukunft, da dies durch die WCF Integrationseinrichtung benötigt wird. (Edit - es wurde in v2.1 hinzugefügt - einen Blick auf ILazyComponentLoaders)

Wie auch immer , unabhängig von fauler Komponente Lader, können das Beste, was Sie tun, ist fließend API zu Charge verwenden, registrieren Sie alle Arten von einer Baugruppe Ihrer benötigten Kriterien im Voraus entsprechen. Es ist nicht viel mehr Code und Sie werden besser schlafen in der Nacht.

Verwenden Sie faul Lader nur, wenn Sie beim Start wirklich nicht genügend Informationen haben (in der Zusammensetzung root ), um zu bestimmen, welche Komponenten Sie benötigen.

Andere Tipps

Windsor nicht unterstützt, dass aus der Box, aber Sie können Erweiterungsmethoden erstellen, dies zu tun:

static class WindsorExtensions
{
    public static object ResolveType(this IWindsorContainer container, Type type)
    {
        if ( type.IsClass && !container.Kernel.HasComponent(type) )
            container.Kernel.AddComponent(type.FullName, type, LifestyleType.Transient);
        return container.Resolve(type);
     }

     public static T ResolveType<T>(this IWindsorContainer container)
     { return (T)ResolveType(container, typeof(T)); }
}

class Program
{
    static void Main(string[] args)
    {
        IUnityContainer unityContainer = new UnityContainer();
        IWindsorContainer windsorContainer = new WindsorContainer();

        Program unityProgram = unityContainer.Resolve<Program>();
        Program castleProgram = windsorContainer.ResolveType<Program>();
    }
}

Krzysztof keine Angst, Ihren eigenen Blog zu verknüpfen hier :) http://devlicious.com/blogs/krzysztof_kozmic/archive/2009/11/16/castle-windsor-lazy-loading.aspx

Auch fand ich diese einfache Implementierung, die in meiner WPF-Anwendung, die Zeichenfolge Constraint entfernen und Sie sind nahe den allgemeinen Fall

public class ViewModelLoader : Castle.MicroKernel.Resolvers.ILazyComponentLoader {
    public IRegistration Load(string key, Type service)
    {
        if (service == null)
            return null;
        if (service.Name.EndsWith("ViewModel", StringComparison.CurrentCultureIgnoreCase))
            return Component.For(service).Named(key);
        else
            return null;
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top