2016-06-16 1 views
0

Название немного вводит в заблуждение, я на самом деле пытаюсь узнать, как использовать Castle Windsor, и я думаю, что я понимаю, что регистрирую интерфейсы/объекты.Попытка понять замок Виндзор Вложение собственности

Что я могу не понять, так это то, как динамически устанавливать свойства в Runtime?

Ниже представлен мой код, интерфейс IFileWriter, реализованный конкретным классом TextFileWriter.

Тогда у меня есть код для моего тестового приложения, в котором я зарегистрировал интерфейс и объект.

Теперь - как создать экземпляр 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>()); 



     } 
    } 
} 
+0

В этом случае вы не хотите, чтобы Castle вводил эти свойства, если вы не знаете, что они уже есть при регистрации компонента, что сделает компонент несколько негибким: вместо этого вы разрешите экземпляр 'ITextWriter' из контейнер - с использованием инфраструктуры DI, ServiceLocator или даже напрямую - и затем вы установите эти свойства на экземпляр, который вы вернете, и сообщите ему, чтобы он написал файл. – stuartd

+0

Хорошо - теперь это имеет смысл. –

ответ

0

Это дубликат Castle Windsor IoC Property Injection simple how-to

Вам нужно, чтобы ваш корневой объект разрешаться Виндзор для любой инъекции (конструктор или свойство), чтобы работать.

Впрыскивание свойств также должно использоваться для необслуживаемых зависимостей. Если требуются зависимости, его следует, вероятно, впрыскивать, используя инъекцию конструктора.

В модульных тестах не следует использовать каркас DI. Они должны просто создать объект непосредственно.

+0

Я думаю, что OP не говорит об модульных тестах. Он ссылается на простое демонстрационное приложение, чтобы использовать контейнер. – khlr

+0

Ах. я прочитал тест и подумал, что это тест. Ответ остается в силе. Вы не сможете протестировать его так, как в приложении веб-форм. Было бы проще отлаживать приложение MVC. Создайте контейнер в global.asax. Установите свои компоненты. создать фабрику контроллеров, которая использует Windsor. изменить контроллер по умолчанию со свойствами, разрешенными с помощью Windosr. – Fran

+0

Я читал это учебное пособие - это НЕ ПРОСТО ЛОЛ. Не для кого-то нового для контейнеров МОК. Я не могу найти какие-либо примеры, которые имеют смысл, и да, я пытаюсь создать демонстрационное приложение, чтобы «видеть», как все работает, и определить, стоит ли дополнительных усилий для моих проектов. В частности, я рассмотрю «создание фабрики контроллеров, которая использует Windsor» и «модифицирует контроллер по умолчанию с свойствами, разрешенными с помощью Windosr». Я думаю, что мне не хватает части фабрики контроллера. Также не используйте MVC, используя WinForms в качестве тестового слоя. –