2016-06-16 1 views
0

Le titre est un peu trompeur, j'essaie actuellement d'apprendre à utiliser Castle Windsor et je pense que je comprends l'enregistrement des interfaces/objets.Essayer de comprendre Castle Windsor Injection de propriété

Ce que je n'arrive pas à saisir est comment définir des propriétés dynamiquement au Runtime?

Voici mon code, une interface IFileWriter implémentée par la classe concrète TextFileWriter.

Ensuite, j'ai le code pour mon application de test à j'ai enregistré l'interface et l'objet.

Maintenant - comment instancier le TextFileWriter et définir les propriétés FilePath, OutputFileName et 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

Dans ce cas, vous ne voulez pas que Castle injecte ces propriétés, à moins que vous ne sachiez ce qu'elles sont déjà lorsque vous enregistrez le composant, ce qui rendrait le composant quelque peu inflexible: vous résolvez une instance de 'ITextWriter' le conteneur - en utilisant un framework DI, un ServiceLocator, ou même directement - et ensuite vous devez définir ces propriétés sur l'instance que vous récupérez, et lui dire d'écrire le fichier. – stuartd

+0

Ok - maintenant c'est logique. –

Répondre

0

C'est un double de Castle Windsor IoC Property Injection simple how-to

Vous devez avoir votre objet racine résolu par Windsor pour tout travailler injection (constructeur ou propriété).

L'injection de propriété doit également être utilisée pour les dépendances non requises. Si les dépendances sont requises, il faut probablement l'injecter en utilisant l'injection du constructeur.

Vos tests unitaires ne doivent pas utiliser un cadre DI. Ils devraient simplement instancier l'objet directement.

+0

Je pense que le PO ne parle pas de tests unitaires. Il se réfère à une application de démonstration simple pour faire usage du conteneur. – khlr

+0

Ah. J'ai lu le test et j'ai pensé que c'était un test. La réponse est toujours valide. Vous ne serez pas en mesure de le tester comme ça dans une application de formulaires Web. Il serait plus facile de déboguer dans une application MVC. Créez le conteneur dans global.asax. installez vos composants. créer une usine de contrôleurs qui exploite Windsor. modifiez le contrôleur par défaut avec les propriétés résolues via Windosr. – Fran

+0

J'ai lu ce tutoriel - ce n'est pas simple lol. Pas pour quelqu'un de nouveau aux conteneurs IOC. Je n'arrive pas à trouver des exemples qui ont un sens, et oui j'essaie de construire une application de démonstration pour "voir" comment tout fonctionne et déterminer si l'effort supplémentaire en vaut la peine pour mes projets. Spé coriquement, je vais regarder dans "créer une usine de contrôleur qui exploite Windsor" et "modifier le contrôleur par défaut avec les propriétés qui sont résolues par Windosr". Je pense qu'il me manque la partie de l'usine du contrôleur. Je n'utilise pas non plus MVC, en utilisant WinForms comme mon banc d'essai. –