Додається до коду, згенеро-ваного за діаграмою класів
Створення об'єктів
package com.kvf.demo;
import com.kvf.demo.IGreeting;
public class Hello implements IGreeting{
public void printGreeting() {
System.out.println("Hello!");
}
}
class Class1 - ?
Задача: передбачити для класу Class1 (у якому використовується вітання printGreeting) можливість заміни об'єкту типу Hi на об'єкт типу Hello, забезпечуючи при тому незмінність коду Class1.
Залежність
?
“Близькі” класи
private IGreeting greeting = new Hello ();
Традиційний прийом із викорис-танням для об'єктів привітання методу printGreeting()
Class1 - звична версія.
(Не підходить!)
Заміна коду!?
package com.kvf.demo;
import com.kvf.demo.*;
public class Super { // Runner
public static void main(String[] args) {
Class1a c = new Class1a();
c.setGreeting( new Hi () );
c.foo();
}
}
Незмінний java-код Class1a !
new Hello ()
Управління по створенню об'єктів типів Hi чи Hello “передано” (Inversion of Control ) класу Super (Runner). Запропонований код забезпечує ін'єкцію залежності (Dependency Injection ) Class1a від класу Hi чи від класу Hello відповідно.
Dependency Injection
Модифікація при пере-ході від Hi до Hello
Дротяна модель
public class Super2 {
public static void main(String[] args) {
ApplicationContext ctx =
new ClassPathXmlApplicationContext("beans_ctx2.xml");
Class2 c = (Class2)ctx.getBean("class2");
System.out.println("Greeting:");
c.foo();
}
Конструктор із параметром
Файл Super2.java
(фрагмент)
Файл Class2.java
Можна вилучити
Файл beans_ctx2.xml (фрагмент)
Додаткова гнучкість пов'язана з можливістю задавати композицію об'єктів під час виконання програми
// Link decorators
d1.SetComponent( c );
d2.SetComponent( d1 );
Ін'єкції
Створення об'єктів
public class ConcreteComponent
implements IComponent{
public void operation(){
System.out.println(
"ConcreteComponent!");
}
}
public class DecoratorA extends Decorator {
public void operation(){
super.operation();
System.out.println("DecoratorA");
}
}
Класи DecoratorB, DecoratorC мають аналогічний вигляд
Декларативний стиль!
public class DecoratorA extends Decorator {
public void operation(){
super.operation();
System.out.println("DecoratorA");
}
}
Задіяна така єдина стратегія використання декораторів: спочатку декорування здійснює внутрішній (ін'єктований) об'єкт, а потім зовнішній.
Важливо!
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
class MainApp
{
static void Main()
{
Context context;
context = new Context(
new ConcreteStrategyA());
context.ContextInterface();
context = new Context(
new ConcreteStrategyB());
context.ContextInterface();
}
}
/// The 'Strategy' abstract class
abstract class Strategy
{
public abstract void AlgorithmInterface();
}
class ConcreteStrategyA : Strategy
{
public override void AlgorithmInterface()
{
Console.WriteLine(
"CalledConcreteStrategyA.”+
”AlgorithmInterface()");
}
}
public class Context {
private IStrategy _strategy;
public Context(IStrategy strategy){
this._strategy = strategy;
}
public void ContextInterface(){
_strategy.AlgorithmInterface();
}
}
Конструктор з параметром
public interface ITextService
{
string GetText(string text);
}
public class FirstTextService : ITextService
{
public string GetText(string text)
{
return String.Format(
"{0}, wellcome to ASP.NET MVC!", text);
}
}
Конструктор
Використання DI у проектах ASP.NET MVC3 (2/2)
Фрагменти Global.asax.cs
public class MyDependencyResolver : IDependencyResolver
{
private readonly IKernel _kernel;
public MyDependencyResolver(IKernel kernel)
{ _kernel = kernel;
}
public object GetService(Type serviceType)
{ return _kernel.TryGet(serviceType, new IParameter[0]);
}
public IEnumerable
Demo-проект із Spring-документації
Если не удалось найти и скачать доклад-презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:
Email: Нажмите что бы посмотреть