据我所知,IoC-container有助于创建服务和工厂等应用程序级对象。但是应该手动创建域级对象。 Spring的手册告诉我们:“通常,不会在容器中配置细粒度的域对象,因为创建/加载域对象通常是DAO和业务逻辑的责任。”
好。但是,如果我的域“细粒度”对象依赖于某些应用程序级对象,该怎么办呢? 例如,我有一个UserViewer(用户用户,UserConstants常量)类。 用户是无法注入的域对象,但UserViewer还需要UserConstants,它是IoC-container注入的高级对象。
我想从IoC容器中注入UserConstants,但我还需要一个瞬态运行时参数User。
设计有什么问题?
提前致谢!
更新
我的问题似乎不够精确。我真正需要的是一个如何做到这一点的例子:
创建类 UserViewer(用户用户,UserService服务)的实例,其中 user 作为参数传递, service 从IoC注入
如果我注入 UserViewer查看器,那么如何将用户传递给它?
如果我手动创建 UserViewer viewer ,那么如何将 service 传递给它?
答案 0 :(得分:4)
这个设计没有任何问题。你使用Factories
,在域中有一条腿,在基础设施中有一条腿。
你可以手动编写它们,也可以让容器为你做这些事情,例如温莎的TypedFactoryFacility。
此外,当您的域对象来自持久层时,您可以将容器插入其中以注入所需的服务(NHibernate可以这样做)。
答案 1 :(得分:1)
但是,如果我的域“细粒度”对象依赖于某些应用程序级对象呢?
正是这被认为是不好的做法。我想问题可能是:
POJO风格是它们可以在所有环境中使用(持久存储在数据库中,在业务算法和规则中处理,在视图技术中读取和设置,序列化并通过网络发送)。在其中注入应用程序级对象可能会导致以下问题:
通常,构成您域名的pojos是独立的。他们可以访问其他pojos(和许多枚举),就是这样。
除了数据之外,他们还有实现业务规则或算法细节的方法(记住OO将数据和代码分组的想法; - )< / em>):
事实上,你经常会发现pojo方法被重用了很多,并且由服务或经理以不同的方式组成。这是减少重复的一大胜利,方法名称提供了非常需要的“含义”,并且提供了对模块新手的开发人员的更容易的访问。
答案 2 :(得分:0)
供您更新:
创建类UserViewer(用户用户,UserService服务)的实例,其中用户作为参数传递,服务从IoC注入。
如果我注入UserViewer查看器,那么如何将用户传递给它?
如果我手动创建UserViewer查看器,那么如何将服务传递给它呢?
在这种情况下,您需要一个工厂方法(可能在您的工厂或定位器上)。它可以看看如下,将两部分分开:
public UserViewer createUserViewer(User user) {
UserViewer viewer = instantiateBean(UserViewer.class);
viewer.setUser(user);
return viewer;
}
private <E> E instantiateBean(Class<E> clazz) {
// call the IoC container to create and inject a bean
}