实现依赖注入设计模式

问题描述 投票:0回答:1

有人告诉我,可以在以下代码中两次实现依赖注入设计模式,并且允许更改方法签名:

public class Person {
    String title;
    ArrayList<String> name = new ArrayList<>();

    public Person() {
        name.add("First");
        name.add("Middle");
        name.add("Last");
    }

    public void setTitle(int i) {
        switch (i) {
            case 0:
                title = "Ms.";
                break;
            case 1:
                title = "Mr.";
                break;
            case 2:
                title = "Mx.";
                break;
    }
    }
}

因此,我添加依赖项注入的尝试如下:

public class Person {
    String title;

    ArrayList<String> name = new ArrayList<>();


    public Person(String First,String Middle,String Last) {
        name.add(First);
        name.add(Middle);
        name.add(Last);
    }

    public void setTitle(String title) {

        this.title = title;

    }
}

这是实施设计模式的正确方法吗?还是可以以更好的方式实现此代码?

java design-patterns dependency-injection solid-principles
1个回答
2
投票

Dependency Injection Principles, Practices, and Patterns本书将依赖注入(DI)定义为

一组软件设计原理和模式,使您能够开发松耦合代码。Chapter 1, page 4

可以从该书第一章的this excerpt中找到DI的简介,或者您可以阅读the full chapter 1 online

[本书的一个重要区别是Stable DependenciesVolatile Dependencies之间的区别。 DI关注的是抽象和注入Volatile Dependencies或作为书籍states

Volatile Dependencies是DI的重点。您是在应用程序中引入Seams的,而不是稳定的依赖关系。同样,这使您有义务使用DI进行组合。

从您的Person类的角度来看,String稳定依赖项。因为依赖项注入与Volatile Dependencies的注入有关,所以我不认为以DI的形式提供名字,中间名和姓氏值。万一构造函数用于注入Volatile Dependency,例如使用界面。例如:

public class UpdatePersonTitleHandler
{
    private PersonRepository repository;

    public UpdatePersonTitleHandler(PersonRepository repository)
    {
        this.repository = repository;
    }

    public void handle(UpdatePersonTitle command)
    {
        Person person = this.repository.getById(command.personId);

        person.setTitle(command.Title);

        this.repository.Update(person);
    }
}

在这种情况下,UpdatePersonTitleHandler'组件'取决于PersonRepository抽象,它是通过其构造函数(使用Constructor Injection)进行的[[injected。在运行时,PersonRepository可能由SqlPersonRepository实现,并且UpdatePersonTitleHandler可能构造如下:

var handler = new UpdatePersonTitleHandler( new SqlPersonRepository("connection string")); // <-- constructor injection
© www.soinside.com 2019 - 2024. All rights reserved.