试图了解Castle Windsor Property注入

时间:2016-06-16 16:27:34

标签: c# properties castle-windsor code-injection castle

标题有点误导,我实际上是想学习如何使用Castle Windsor,我想我理解注册接口/对象。

我似乎无法掌握的是如何在运行时动态设置属性?

下面是我的代码,一个由TextFileWriter具体类实现的IFileWriter接口。

然后我有我的测试应用程序的代码,我已经注册了界面和对象。

现在 - 如何实例化TextFileWriter并设置FilePath,OutputFileName和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>());



        }
    }
}

1 个答案:

答案 0 :(得分:0)

这是Castle Windsor IoC Property Injection simple how-to

的副本

您需要让Windsor解析您的根对象,才能使任何注入(构造函数或属性)起作用。

属性注入也应该用于非必需的依赖项。如果需要依赖项,则应该使用构造函数注入来注入它。

您的单元测试不应该使用DI框架。他们应该直接实例化对象。