2013-09-25 167 views
0

我已经在使用CDI@Inject在我的一些课程中获得一些无状态的服务。域对象被注入吗?

我不知道是否也将是有意义的注入域对象,如下面的例子:

class UserSettings; 

class User { 
    //@Inject 
    private UserSetttings settings = new UserSettings(); 
} 

用户应该始终有附加了一些默认设置,以后可以改变。你会在这里使用CDI,还是坚持手动创建一个新对象?

或者更一般的说法:在哪里使用CDI来说一般意义上的?哪里不?


更新监制:

class Preferences { 
    @Produces @DefaultSettings 
    public UserSettings getDefaultSettings() { 
     UserSettings settings = new UserSettings(); 
     //configure default 
     return settings; 
    } 
} 


class User { 
    @Inject @DefaultSettings 
    private UserSettings settings; 
} 

回答

0

可以注入域对象。你可能不想注入默认的域对象,而是想为它提供一个生产者。这个生产者基本上会根据一些设置创建域对象。你可以有一个“管理员”类型的类,它根据某些东西来加载具有必要属性的对象,比如当前登录的用户。现在我做了类似的事情,拿着委托人并使用它来查找登录用户的信息,创建类似UserSettings的信息。你只需要确保你的UserSettings不是注射剂,使用否决权扩展或甚至不安装它。

替代方案(我不特别喜欢但可以工作)是为了让您的域对象注入对持久性域的引用来查找数据。从概念上讲,它看起来更清洁一些。设置代码将采用@PostConstruct方法。

+0

所以,因为我是生产者新手:我更新了我的第一篇文章 - 这是你会在这种情况下建议吗?或者,如果不是,你能举一个例子吗? – membersound

+0

是的,这是一种方法。 '@ DefaultSettings'没有登录?如果用户有自定义设置,会不会有另一种情况? –

0

用户应该始终有附加了一些默认设置,可以 后来改变。你会在这里使用CDI,还是坚持手动创建一个新的对象?

如果您的应用程序启用了CDI,那么您应该使用CDI,而不是手动创建新对象。

哪里使用CDI通常有意义?哪里不?

CDI有很多更广泛的用途,允许开发人员具有很大的灵活性,以松耦合的,但类型安全方式的各种组件的集成。所以,CDI应该使用所有Java EE 6EE 7应用程序。如果您的应用程序不支持CDI,那么您不应该使用它。

0

我想补充一点:好的代码可以测试。而使用依赖注入来支持“Inversion of Control”总是一个好主意。想想你会如何测试你的代码,如果是通过

private final UserSettings s = new UserSettings();内部创建设置...

这是很容易使其注射,然后用测试范围(尖注射框架:用针( https://github.com/akquinet/needle))。