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>());
}
}
}
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
Ok - jetzt macht das Sinn. –