有人告诉我,可以在以下代码中两次实现依赖注入设计模式,并且允许更改方法签名:
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;
}
}
这是实施设计模式的正确方法吗?还是可以以更好的方式实现此代码?
Dependency Injection Principles, Practices, and Patterns本书将依赖注入(DI)定义为
一组软件设计原理和模式,使您能够开发松耦合代码。(Chapter 1, page 4)
可以从该书第一章的this excerpt中找到DI的简介,或者您可以阅读the full chapter 1 online。
[本书的一个重要区别是Stable Dependencies和Volatile 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