Если вы испытывали затруднение с тем, как внедрять не singleton-зависимости в CAB, то вот вам решение:
- TransientContainerService;
- TransientDependencyStrategy;
- TransientDependencyAttribute;
Зато такие возможности есть в любом полноценном IoC-контейнере, например в Unity, который я и использовал. В результате мы имеем 2 IoC-контейнера в одном приложении!
Теперь по порядку.
TransientContainerService
Как я уже говорил, я использовал в своем решении Unity, но дабы не вводить жесткую зависимость от одной реализации контейнера я ввел интерфейс ITransientContainerService, который абстрагирует нас от конкретной реализации.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9rUsRiNzWwvMpqTutcj8-5TbrFw7j0vwSHa0jtSCNK6OB1RfWS9pHVeQt8RrQ9EOz596NUSgmL0hRR31zRRWehfLQTl-jjwSYC7RyemcJLwbhpY2bUAdwhGV93ikc-dxwrgAX0TlJ4Kni/s400/ITrContainer.png)
TransientContainerService наследник интерфейса, использующий Unity поумолчанию.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhl9HMZUPEuodknQUkNWi3352glgjSaRNIUwTMuwg9f7A8njO4lprCLEotGneqvswO8LInrheotnkZeku5j_MP0As96UdQMFfCCfWorRiraTuI1XE-UA1N8wL7ZrBvM1wT6l9QiQebCuuHr/s400/TrContainer.png)
TransientDependencyStrategy
Для того, чтобы вся конструкция заработала необходимо добавить сию стратегию в коллекцию стратегий ObjectBuilder'а на этап инициаллизации объекта (т.к. объект к этому моменту уже должен существовать). Ее задача находить "временные" (transient) зависимости и вычислять их.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjy4XByiOOkZM-LB5lONMmRnItBROZ-7wx7QF5o7rFPQQYzyMO3N5tSin8wZsOfVYuT3KaaElx2cijeQhO3ilKYYKLttsN8cK0p4cm0V0CWYiLRAkYJ2H53Bzbx1M_NzoNAj_0BoHeaGGNa/s400/TrStrategy.png)
TransientDependencyAttribute
Для того, чтобы стратегия поняла что именно необходимо внедрить, зависимость необходимо пометить атрибутом TransientDependencyAttribute. У этого аттрибута есть строковое свойство Id, с помощью которого можно вычислить именованную зависимость.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSjNX-Y7WerZCgtmJFVrptEkCP4pVqiRURzvKYngq1-n2wJT-MHWOvUcWe-B7ifHodOEEg9Ncah6EBnZlrzJRPVzL24o_NWB5h6uUd2lUEcjK504-LrADXlWpN0ZmnhJP4Tq91wlo_PgZd/s400/TrAttr.png)
Основная работа по выведению зависимости происходит в методе GetValue внутреннего класса TransientParameter. Зависимость выводится при помощи вышеописанного сервиса ITransientContainerService, простой делегацией этого процесса Unity. Далее, созданный объект пропускается через конвеер стратегий ObjectBuilder'а, с тем чтобы внедрить в него зависимости, т.к. он тоже может иметь зависимости в свойствах и методах. Единственное ограничение здесь будет необходимость в конструкторе указывать тоько временные зависимости, т.к. создавать этот объект будет не ObjectBuilder CAB'а, а Unity.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgv5vnPd-TF2MjUMhJYEkM4mNZ3E3Su9ZhgcDnG8RItzK2gwdpPGxDusXuUZKyBBqiYvjBTWqaKyutNqOJRlfLG7BTq5wfeTbVVLhcXSQJcg4Dd1kmKGE1mhfx7f5O3vVxZCi-ehWK5VyOT/s400/TrParam.png)
Пример.
Так может выглядеть это в коде:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgf_hUPhP9CTQIhQe4kzU6M_o_tFH0m1S6L49gHzSynlmDs1Hlm-RfDX_TyUSG7djsewIyE8HQm5Q3Wu1NarFV9iJdOMgJcjb-0Lz5jp0zrWs1St1VHFEisdYsj8mdKJZQ9giukBfwu1cUF/s400/TrEx.jpg)
Удачи!
P.S. Ниже привожу список ресурсов и статей, полезных для понимания ObjectBuilder, Unity и IoC вообще.
http://tavaresstudios.com/Blog/post/Deconstructing-ObjectBuilder---Introduction.aspx
http://tavaresstudios.com/Blog/post/Deconstructing-ObjectBuilder---What-Is-ObjectBuilder.aspx
http://tavaresstudios.com/Blog/post/Deconstructing-ObjectBuilder---Combining-Strategies.aspx
http://tavaresstudios.com/Blog/post/Deconstruction-ObjectBuilder---Wiring2c-part-1.aspx
http://tavaresstudios.com/Blog/post/End-of-the-Deconstruction.aspx
http://davidhayden.com/blog/dave/archive/2008/02/27/UnityConstructorInjectionGreediestMostParametersTheLineHasBlurredMaybe.aspx
http://weblogs.asp.net/podwysocki/archive/2008/03/25/ioc-and-unity-the-basics-and-interception.aspx
http://weblogs.asp.net/podwysocki/archive/2008/02/22/ioc-and-the-unity-application-block-going-deeper.aspx
http://weblogs.asp.net/podwysocki/archive/2008/02/26/ioc-and-the-unity-application-block-once-again.aspx
http://weblogs.asp.net/podwysocki/archive/2008/03/04/ioc-containers-unity-and-objectbuilder2-the-saga-continues.aspx
http://www.hanselman.com/blog/ListOfNETDependencyInjectionContainersIOC.aspx
Комментариев нет:
Отправить комментарий