2009-08-17 1 views
1

Ich verwende die von Bojan Resnik in this question beschriebene Methode, um Instanzen von Klassen aufzulösen, die nicht im Windsor-Container registriert sind. Das Problem besteht darin, dass diese Klassen nicht als "Dienste" für andere aufgelöste Instanzen verfügbar sein sollen.Castle IoC - Wie kann ich verhindern, dass registrierte Komponenten als Abhängigkeiten aufgelöst werden?

Zum Beispiel angesichts der folgenden Klassen:

class Order 
{ 
    public Order(ITaxCalculator tc) 
    { 
     // ... 
    } 
} 

class SomeOtherThing 
{ 
    public SomeOtherThing(ISomeOtherService sos) 
    { 
     // ... 
    } 

    Order CurrentOrder 
    { 
     get; 
     set; 
    } 
} 

static class WindsorExtensions 
{ 
    public static object Create(this IWindsorContainer container, Type type) 
    { 
     if (!type.IsClass) 
     { 
      throw new ArgumentException("not class", "type"); 
     } 

     if (!container.Kernel.HasComponent(type)) 
     { 
      container.Kernel.AddComponent(type.FullName, type, LifestyleType.Transient); 
     } 

     return container.Resolve(type); 
    } 

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

Ich möchte sagen können:

Order order = container.Create<Order>(); 
SomeOtherThing thing = container.Create<SomeOtherThing>(); 

Aber ich will nicht eine neue Instanz des Ordens in bekommen injiziert die CurrentOrder-Eigenschaft von SomeOtherThing. Grundsätzlich möchte ich, dass der Container die Instanz erstellt, damit die Abhängigkeiten injiziert werden können, aber ich möchte nicht, dass die Klassen für die Injektion in andere Klassen verfügbar sind.

Ich habe nichts dagegen, dass ich zusätzliche Erweiterungen in den Container schreiben muss, um dies zu erreichen, wenn mir jemand in die richtige Richtung zeigen kann.

Antwort

0

Standardmäßig verwendet windsor die Konstruktorinjektion über die Eigenschafteninjektion. Aus diesem Grund wird CurrentOrder niemals in die SomeOtherThing-Klasse eingefügt, es sei denn, Sie fügen sie dem Konstruktor hinzu.

Wenn Sie Ihren Code betrachten, werden Sie die Komponente im Wesentlichen spät im Container registrieren. Wenn Sie sicher sein wollten, dass es nie injiziert wurde, könnten Sie es entfernen, sobald es z.

static class WindsorExtensions 
{ 
public static object Create(this IWindsorContainer container, Type type) 
{ 
    if (!type.IsClass) 
    { 
     throw new ArgumentException("not class", "type"); 
    } 
    if (!container.Kernel.HasComponent(type)) 
    { 
     container.Kernel.AddComponent(type.FullName, type, LifestyleType.Transient); 
    } 
    object instance = container.Resolve(type); 
    container.Kernel.RemoveComponent(type.FullName); 
    return instance; 

} 

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

Ich denke this workaround Ihr Problem lösen wird, da sie ein Kind Kernel für die „unregistered“ Komponente verwendet, so sollte es nicht andere Komponenten beeinflussen.

Verwandte Themen