2016-06-16 22 views
0

Der Titel ist ein bisschen irreführend, ich versuche tatsächlich zu lernen, wie Castle Windsor zu verwenden und ich glaube, ich verstehe die Registrierung der Schnittstellen/Objekte.Versucht, Castle Windsor Property Injektion zu verstehen

Was ich nicht zu begreifen scheint ist, wie man Eigenschaften dynamisch zur Laufzeit einstellt?

Unten ist mein Code, eine IFileWriter-Schnittstelle, die von der konkreten TextFileWriter-Klasse implementiert wird.

Dann habe ich den Code für meine Testanwendung, ich habe die Schnittstelle und das Objekt registriert.

Jetzt - wie instanziiere ich den TextFileWriter und die Eigenschaften FilePath, OutputFileName und DataToWrite?

namespace IOCv2Library.Interfaces 
{ 
    public interface IFileWriter 
    { 
     string OutputFileName { get; set; } 
     string filePath { get; set; } 

     DataTable DataToWrite { get; set; } 

     void WriteFile(); 
    } 
} 

namespace IOCv2Library 
{ 
    public class TextFileWriter : IFileWriter 
    { 
     private DataTable _dataTable = null; 
     private string _filePath = String.Empty; 
     private string _outputFileName = String.Empty; 

     public DataTable DataToWrite 
     { 
      get{ return _dataTable; } 

      set { _dataTable = value; } 
     } 

     public string filePath 
     { 
      get { return _filePath; } 

      set { _filePath = value; } 
     } 

     public string OutputFileName 
     { 
      get { return _outputFileName; } 

      set { _outputFileName = value; } 
     } 

     public void WriteFile() 
     { 
      string fullFileName = Path.Combine(new string[] { _filePath, _outputFileName }); 
      using (StreamWriter file = 
      new StreamWriter(fullFileName, true)) 
      { 
       foreach (DataRow drRow in _dataTable.Rows) 
       { 
        foreach (DataColumn dcCol in _dataTable.Columns) 
        { 
         file.Write(drRow[dcCol].ToString() + "\t"); 
        } 
        file.Write(Environment.NewLine); 
       } 
      } 
     } 
    } 
} 

namespace TestCastleWindsorIOCv2 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      var container = new WindsorContainer(); 
      container.Register(Component.For<IFileWriter>().ImplementedBy<IOCv2Library.TextFileWriter>()); 



     } 
    } 
} 
+0

In diesem Fall möchten Sie nicht, dass Castle diese Eigenschaften injiziert, es sei denn, Sie wissen, was sie bereits sind, wenn Sie die Komponente registrieren, was die Komponente etwas unflexibel macht: Sie würden stattdessen eine Instanz von ITextWriter auflösen den Container - mit einem DI-Framework, einem ServiceLocator oder sogar direkt - und dann würden Sie diese Eigenschaften für die Instanz, die Sie zurück erhalten, festlegen und sie anweisen, die Datei zu schreiben. – stuartd

+0

Ok - jetzt macht das Sinn. –

Antwort

0

Dies ist ein Duplikat Castle Windsor IoC Property Injection simple how-to

Sie benötigen Root-Objekt gelöst durch Windsor für jede Injektion (Konstruktor oder Eigentum) zu arbeiten haben.

Die Eigenschafteninjektion sollte auch für nicht benötigte Abhängigkeiten verwendet werden. Wenn Abhängigkeiten erforderlich sind, sollte es wahrscheinlich mithilfe der Konstruktorinjektion injiziert werden.

Ihre Unit-Tests sollten kein DI-Framework verwenden. Sie sollten das Objekt direkt instanziieren.

+0

Ich denke, das OP spricht nicht über Komponententests. Er bezieht sich auf eine einfache Demo-App, um den Container zu nutzen. – khlr

+0

Ah. Ich las Test und dachte, dass es ein Test war. Die Antwort ist immer noch gültig. Sie werden es nicht so in einer Webformular-App testen können. Es wäre einfacher, in einer MVC-App zu debuggen. Erstellen Sie den Container in global.asax. Installieren Sie Ihre Komponenten. Erstellen Sie eine Controller Factory, die Windsor nutzt. Ändern Sie den Standardcontroller mit Eigenschaften, die über Windosr aufgelöst werden. – Fran

+0

Ich habe dieses Tutorial gelesen - es ist nicht einfach lol. Nicht für jemanden, der nichts mit IOC-Containern zu tun hat. Ich kann keine Beispiele finden, die Sinn ergeben, und ja, ich versuche eine Demo-App zu erstellen, um zu sehen, wie alles funktioniert und festzustellen, ob sich der zusätzliche Aufwand für meine Projekte lohnt. Sphärisch werde ich in "Erstellen einer Controller Factory, die Windsor nutzt" und "Ändern der Standard-Controller mit Eigenschaften, die durch Windosr gelöst werden" aussehen. Ich denke, ich vermisse den Controller-Fabrikteil. MVC auch nicht verwenden, WinForms als mein Testbett verwendend. –