Паттерны: Inversion of Control (IoC), Dependency Injection (DI) и Interception реализованы в
Unity (= Unity Application Block; есть исходники).
Перед компиляцией для папки Tests надо выполнить Unload Projects in Solution Folders (см. контекстное меню папки).
Для использования Unity в cсвоем проекте надо к подключить две сборки: Microsoft.Practices.ObjectBuilder2 и Microsoft.Practices.Unity.
Небольшой пример:
using System.Windows.Forms; |
using Microsoft.Practices.Unity; |
public class Test : ITest |
| public Test(string value) |
| public void Call(int value) |
public partial class Form1 : Form |
| IUnityContainer myContainer = new UnityContainer(); |
| /// при вызове myContainer.Resolve<ITest>(): |
| /// - вызван конструктор, который получит "1" |
| /// - в свойство Value пападет "3" |
| myContainer.RegisterType<ITest, Test>( |
| new InjectionConstructor("1"), |
| new InjectionMethod("Call", 2), |
| new InjectionProperty("Value", "3") |
| var tst = myContainer.Resolve<ITest>(); |
Интересно, что информацию о типе, создаваемого объекта, а также значения передаваемые в его методы, можно определить в config-файле, а не в методе RegisterType, как это приведено в примере.
Надо заменить, что делать аналогичную инициализацию объекта немного избыточно. Намного проще реализовать метод, например, так:
myContainer.RegisterType<ITest>(() => |
| var ret = new Test("1") { Value = "3" }; |
То есть в момент вызова метода myContainer.Resolve
будет вызвана фабрика объекта (анонимный метод).
Подробнее о паттернах см. здесь.
Комментариев нет:
Отправить комментарий