2016-06-29 16 views
1

Ich verwende Unity für die Abhängigkeitsinjektion. Ich möchte so etwas wie dieses Ziel erreichen:Wie Unity eine Methode nach dem Erstellen einer Objektinstanz aufruft, aber bevor sie irgendwo injiziert wird

public interface MyInterface { void MyMethod(); } 

Wenn Unity Behälterbau:

myContainer.RegisterType<MyInterface, MyConcreteType>(); 

myContainer.AddPostConstructor(x => (x as MyInterface)?.MyMethod()); 

Ist es möglich? Gibt es einen besseren/eleganteren Weg?

+0

Ist die Methode aus der gleichen Klasse? dann rufen Sie es vom Klassenkonstruktor auf. –

+0

Das Problem ist, dass es mehrere Klassen geben kann, die MyInterface implementieren, einige können in der Zukunft hinzugefügt werden. Sie können durch ihre konkreten Typen gelöst werden, nicht unbedingt durch MyInterface. – Jimmyjoe

Antwort

0

andere Art und Weise - registrieren Implementierungen über spezielle Fabrik und verwenden es:

class Factory 
{ 
    IUnityContainer _container; 

    public Factory(IUnityContainer container) 
    { 
     _container = container; 
    } 

    public void Register<TType>() where TType : MyInterface 
    { 
     myContainer.RegisterType<MyInterface, TType>(new InjectionFactory(c => 
     { 
      var result = c.Resolve<TType>(); 
      result.MyMethod(); 
      return result; 
     })); 
    } 

    public MyInterface Get() 
    { 
     _container.Resolve<MyInterface>(); 
    } 
} 

...

public TestClass 
{ 
    Factory _factory; 
    public TestClass(Factory factory) 
    { 
     _factory = factory; 
     _factory.Register<MyConcreteType>(); 
    } 

    public void TestMethod() 
    { 
     var service = _factory.Get(); 
    } 
} 

Also, alle zukünftigen Implementierungen muss in der Fabrik registriert sein. Trotzdem kann nicht garantiert werden, dass die Methode MyMethod korrekt implementiert oder implementiert wird.

+0

Genau das habe ich gebraucht, danke! Was die Methode betrifft, muss sie wie von MyInterface deklariert implementiert werden. Wenn ein Programmierer die Implementierungsmethode leer lässt, ist es ihre bewusste Entscheidung (die in einigen Fällen korrekt sein kann). – Jimmyjoe

0

Vielleicht wie diese somethig:

myContainer.RegisterType<MyInterface, MyConcreteType>(new InjectionFactory(c => 
{ 
    var result = c.Resolve<MyConcreteType>(); 
    result.MyMethod(); 
    return result; 
})); 
+0

Das würde wahrscheinlich funktionieren, aber nur für einen konkreten Typ. Ich möchte, dass die Methode für alle Instanzen eines beliebigen Typs aufgerufen wird, der MyInterface implementiert, selbst wenn jemand eine neue Klasse hinzugefügt hat, die dies implementiert. – Jimmyjoe