Skip to content

Indirect dependencies

Suremaker edited this page Dec 11, 2012 · 2 revisions

It may happen that some objects indirectly depend another and require dependent objects to be created before them in order to initialize or work properly. It may also happen, that container is having multiple unrelated trees of objects, but creation of one suppose trigger also creation of another tree.

DependingOn() and DependingOnDefault() methods allows to specify such indirect dependencies. If used, it is guaranteed that specified object would be instantiated and configured before one that is currently being configured.

ctx.RegisterDefault<Endpoint>();

ctx.RegisterDefault<Consumer>()
	.UseConstructor((IEndpoint endpoint) => new Consumer(endpoint))
		.BindConstructorArg().ToRegisteredDefault();

ctx.RegisterDefault<Sender>()
	.DependingOnDefault<Consumer>()
	.UseConstructor((IEndpoint endpoint) => new Sender(endpoint))
		.BindConstructorArg().ToRegisteredDefault();

Sender sender = ctx.GetObject<Sender>();
sender.Send("some text");

The above example shows usage of DependingOnDefault() method. In presented configuration, Sender object depends on Consumer object, so it is guaranteed that consumer object would be created before sender object. In a result of that, assuming that Consumer object starts receiving messages as soon as it is constructed, if we request request object from context and send some message, it would be properly consumed. Without usage of DependingOnDefault() method, it would be needed to instantiate Consumer before Sender manually like that:

ctx.GetObject<Consumer>(); //result of it would be never used in code, but has to be present to trigger consumer creation

Sender sender = ctx.GetObject<Sender>();
sender.Send("some text");

The DependingOn() method allows to created indirect dependency on object using id or reference.

Continue reading: 10. Autowiring

Clone this wiki locally